65.9K
CodeProject 正在变化。 阅读更多。
Home

Java 聊天应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (68投票s)

2013年1月8日

CPOL

3分钟阅读

viewsIcon

627535

downloadIcon

93900

一个可以同时处理多个用户的聊天应用程序。

Sample Image

引言

在本文中,我将演示一个可以同时处理多个用户的聊天应用程序。它还支持文件传输。

它完全基于Java,由两部分组成:jMessenger(客户端应用程序)和 jServer(服务器应用程序)。

特点

  1. 同时处理多个用户
  2. 支持公共和私有消息
  3. 提供用户注册和登录功能 
  4. 支持文件传输

使用代码

运行jar文件jMessenger.jarjServer.jar,然后执行以下操作

  1. 在jServer中,选择“data.xml”作为数据库文件。该文件包含用户名和密码。
  2. 在jMessenger中,选择“History.xml”作为历史文件。该文件用于保存聊天记录。
  3. 在许多情况下,如果jMessenger无法找到服务器,请调整防火墙以允许其访问网络。

这两个应用程序都是用Netbeans编写的,您可以将源代码文件导入Netbeans以查看和编辑它们。

消息结构

jMessenger中的每条消息都有四个字段

  • type:可以设置为messageloginnewuser等。
  • sender:发送者的用户名
  • content:消息的实际内容
  • Recipient:消息接收者的用户名

jServer

jServer中有两个主要的类用于处理连接和消息。启动时,SocketServer在单独的线程中运行。SocketServer的任务是等待连接,并为每个连接启动一个新的线程ServerThread。一旦建立连接,ServerThread将监听任何消息并将其交给SocketServer进行处理。它还会将其他用户发送的消息转发给已连接的用户。

// In ServerThread read the incoming message and hand it to SocketServer

Message msg = (Message) streamIn.readObject();
server.handle(ID, msg);
.......


// In SocketServer process the messages based on their type

public synchronized void handle(int ID, Message msg){  
	if(msg.type.equals("login")){
		....
	}
	else id(msg.type.equals("message")){
		if(msg.recipient.equals("All")){ Announce("message", msg.sender, msg.content); }
		else{
			// Find the thread of recipient and forward it to him
		}
	}
.......

jMessenger

jMessenger首先连接到jServer,通过其IP地址和端口号指定。到达的消息随后会连同其发送者一起显示在消息板上。

当用户想要发送文件时,首先会发送一个类型为upload_req的消息请求。然后,接收者执行以下操作

  1. 接收方通过类型为upload_res的消息发送其回复
  2. 如果请求被接受,则接收方会打开一个新的端口
  3. 对于肯定回复,接收方的IP地址和端口号会发回
  4. 发送方在收到肯定回复后连接到此套接字并开始文件上传

这种方法的优点是客户端可以同时聊天和传输文件。与消息不同,文件不通过jServer。

// On recipient side, start a new thread for download

Download dwn = new Download(....);
Thread t = new Thread(dwn);
t.start();
send(new Message("upload_res", ui.username, dwn.port, msg.sender));
// Reply to sender with IP address and port number
.........

// On sender side, start a new thread for file upload

// Connect to the port specified in reply
Upload upl = new Upload(addr, port, ui.file, ui);
Thread t = new Thread(upl);
t.start();

更新

关于该项目,存在很多困惑。我想在这里澄清一下。 

1. 聊天历史记录不完整。该项目的主要目的是演示网络概念,由于时间限制,它没有完成。

2. 很多人感到困惑,为什么无法在不同的网络上进行聊天。要理解这一点,请以任何Web服务器为例。任何浏览器要连接到Web服务器,该服务器需要具有全局IP地址,以便在互联网上可见。  类似地,jServer也是一个应用程序服务器,要在两个不同的网络上(例如校园局域网和您家的DSL)进行聊天,它也需要在具有全局IP地址的计算机上运行。 

关于这个项目 

这是一个我想与他人分享的课程项目。源代码在The Code Project Open License (CPOL)下授权。该项目的目的是演示Java套接字,因此整个历史记录功能并没有像我希望的那样实现得很好。如果本文对您有所帮助,请告诉我。

© . All rights reserved.