在本文中,我将演示一个可以同时处理多个用户的聊天应用程序。它还支持文件传输。
它完全基于Java,由两部分组成:jMessenger(客户端应用程序)和jServer(服务器应用程序)。
链接:https://pan.baidu.com/s/1ujGOp2j9osyoY3J8PzvLiQ
提取码:yyds
同时处理多个用户
支持公共和私人消息
用户注册和登录可用
支持文件传输
运行 jar 文件jMessenger.jar和jServer.jar并执行以下操作:
在 jServer 上选择“ data.xml ”作为数据库文件。该文件包含用户名和密码。
在 jMessenger 上选择“ History.xml ”作为历史文件。此文件用于保存聊天记录。
在许多情况下,如果 jMessenger 找不到服务器,则调整防火墙以使其能够访问网络。
这两个应用程序都是用 Netbeans 编写的,您可以在 Netbeans 中导入源文件以查看和编辑它们。
jMessenger 中的每条消息都有四个字段:
type: 可以设置为message, login,newuser等。
sender: 发件人的用户名
content: 消息的实际内容
Recipient: 邮件收件人的用户名
jServer中有两个主要的类用于处理连接和消息。启动时SocketServer在单独的线程中运行。的工作SocketServer是等待连接并为每个连接启动一个新线程ServerThread。建立连接后,ServerThread将侦听任何消息并将其移交SocketServer给处理。它还会将来自其他用户的消息转发给连接的用户。
JAVA
// 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 首先连接到由其 IP 地址和端口号指定的 jServer。然后,到达的消息及其发件人会显示在留言板上。
当一个用户想要发送一个文件时,首先他的请求是通过一个类型为 的消息发送的upload_req。然后收件人执行以下操作:
接收方在类型的消息中发送其回复upload_res
如果请求被接受,则接收者打开一个新端口
对于肯定回复,收件人的 IP 地址和端口号将被发回
发送者在收到肯定回复后连接到此套接字并开始文件上传
这种方法的一个优点是客户端可以同时聊天和传输文件。与消息不同,文件不通过 jServer。
JAVA
// 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 地址,以便在Internet 上可见。 同样,jServer 也是一个应用程序服务器,对于通过两个不同的网络(比如校园 LAN 和您家中的 DSL)进行聊天,它还需要在具有全球 IP 地址的计算机上运行。
这是一个课堂项目,我想与他人分享。源代码根据代码项目开放许可证 (CPOL)获得许可。这个项目的目的是演示 Java 套接字,所以整个历史特性的实现并没有我希望的那么好。如果这篇文章证明有任何帮助,请告诉我。
jServer两个类分别用来连接和消息:
在启动时SocketServer后,它会监听是否有客户端连接服务器,当发现客户端链接后创建一个线程到ServerThread。
ServerThread创建后就会持续的监听来自客户端的消息,并将消息交由SocketServer处理,Server将客户端用户名和密码保存在data.xml中。
jMessenger通过ip地址和端口号连接到jServer。到达的消息以及它们的发送者会显示在留言板上。在传输文件时,文件并不通过服务器,而是客户端之间启用单独线程直接传输,这样可以同时进行聊天和文件传输。jMessenger将消息记录保存在History.xml中,可以查看聊天历史记录。
data.xml中保存有登录账号名密码
可以看到李雷被拒绝的事情Anurag并不知情
当传送文件时,使用客户端与客户端链接,而不通过服务端
接收方需要同意
Ref:
https://www.codeproject.com/Articles/524120/A-Java-Chat-Application
注:该程序不支持中文