Java 聊天应用程序






4.82/5 (68投票s)
一个可以同时处理多个用户的聊天应用程序。
引言
在本文中,我将演示一个可以同时处理多个用户的聊天应用程序。它还支持文件传输。
它完全基于Java,由两部分组成:jMessenger(客户端应用程序)和 jServer(服务器应用程序)。
特点
- 同时处理多个用户
- 支持公共和私有消息
- 提供用户注册和登录功能
- 支持文件传输
使用代码
运行jar文件jMessenger.jar 和 jServer.jar,然后执行以下操作
- 在jServer中,选择“data.xml”作为数据库文件。该文件包含用户名和密码。
- 在jMessenger中,选择“History.xml”作为历史文件。该文件用于保存聊天记录。
- 在许多情况下,如果jMessenger无法找到服务器,请调整防火墙以允许其访问网络。
这两个应用程序都是用Netbeans编写的,您可以将源代码文件导入Netbeans以查看和编辑它们。
消息结构
jMessenger中的每条消息都有四个字段
type
:可以设置为message
、login
、newuser
等。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
的消息请求。然后,接收者执行以下操作
- 接收方通过类型为
upload_res
的消息发送其回复 - 如果请求被接受,则接收方会打开一个新的端口
- 对于肯定回复,接收方的IP地址和端口号会发回
- 发送方在收到肯定回复后连接到此套接字并开始文件上传
这种方法的优点是客户端可以同时聊天和传输文件。与消息不同,文件不通过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套接字,因此整个历史记录功能并没有像我希望的那样实现得很好。如果本文对您有所帮助,请告诉我。