我正在用Java创建一个聊天应用程序。我没有遇到服务器接受多个客户端套接字连接和维护多个线程的问题。我已经设法让他们发送和接收消息。
但是,我无法弄清楚如何创建到同一特定客户端的多个套接字连接。在服务器和客户端上,我已经有一个用于发送和接收聊天消息的线程。我希望在此之上有另一个连接来做背景事情,例如发送文件,同时继续传递聊天消息。
例如,Client1和Client2通过服务器相互发送消息,该服务器保存帐户和聊天消息的数据库。我希望能够从Client1向Client2发送文件,反之亦然。
Connection1: Client1 <--message--> Server <--message--> Client2
Connection2: Client1 --file--> Server --file--> Client2
or
Connection2: Client1 --file--> Client2
我在考虑每个客户端如何拥有IP地址,我可以使用它们来创建新连接。但是,因为我在localhost上运行它,所以所有IP地址都是相同的,所以我不能这样做。
答案 0 :(得分:0)
在服务器端:使用两个不同的端口打开两个ServerSockets。
在客户端:打开两个客户端套接字,一个连接到聊天服务器,另一个连接到文件服务器。
但是,我不确定你是否在同一个网卡上赢得了两个连接。我建议您在收到命令(聊天或其他消息)时区分这些命令,并使用两个不同的队列(或使用一个队列并将层次结构设置为您的任务)来为它们提供服务。您也可以使用ThreadPool来执行任务。
在任何情况下,您都可以使用非阻塞I / O(NIO),查看支持它的Netty和Jetty项目。
现在为Connection2: Client1 --file--> Client2
在客户端之间使用P2P可以提高性能和服务器的网络资源,但当然你会失去匿名性,而且要复杂得多。假设聊天对话仅在两个用户之间(维持NN P2P聊天是一项更复杂的任务),您可以为客户端设备配备ServerSocket支持,并始终使其中一个作为服务器,另一个作为客户端。
实际上,您可以使用现有的ServerSocket来同步用户(使用一些命令)并指导用户。仅将此套接字用作用户匹配服务器。当您需要在两个用户之间启动聊天时,请其中一个用户运行ServerSocket,另一个用户运行客户端套接字。告知他们彼此的IP并让他们自己连接。您的服务器现在只是一个中介,只启动连接。
*如果您运行P2P解决方案,为什么不将其用于聊天+文件服务? (如果你不需要记录消息,你可以这样做,这样你的服务器只会做一个裁判)。
**关于用于P2P的端口号,您可能需要为路由器设置NAT规则。