2015-01-03 19 views
0

我正在用Java创建一个聊天应用程序。我毫不费力地让服务器接受多个客户端套接字连接并维护多个线程。我已经设法让他们发送和接收消息。在Java中,如何创建到同一特定客户端的多个套接字连接?

然而,我无法弄清楚如何创建多个套接字连接到同一个特定的客户端。在服务器和客户端上,我都有一个用于发送和接收聊天消息的线程。我希望有另外一个连接来做后台工作,比如发送文件,同时继续传递聊天消息。

例如,客户端1和客户端2通过服务器,这使帐户数据库和聊天消息短信彼此。我希望能够从Client1发送文件到Client2,反之亦然。

Connection1: Client1 <--message--> Server <--message--> Client2 
Connection2: Client1 --file--> Server --file--> Client2 
or 
Connection2: Client1 --file--> Client2 

我在想如何为每个客户端有IP地址,我可以使用它们来创建新的连接。但是,由于我在本地主机上运行这个,所有的IP地址都是相同的,所以我不能这样做。

+1

使用TCP端口? – xTrollxDudex

+0

IRC很久以前就解决了这个问题。看看[DCC](http://en.wikipedia.org/wiki/Direct_Client-to-Client)如何处理它。 (这不是所有的NAT友好的,但你不会发现很多,除非服务器最终涉及每个字节传输。) – cHao

+0

客户端连接到服务器,而不是相反。 – EJP

回答

0

在服务器端:使用两个不同的端口打开两个ServerSockets。

在客户端:连接到聊天服务器打开两个客户接一个,另一个你的文件服务器。

但是,我不知道你是否在同一个网卡上用两个连接赢得了一些东西。我建议你在接收到命令时(聊天或其他消息)区分命令并使用两个不同的队列(或者使用一个队列并为您的任务设置层次结构)为它们提供服务。您也可以使用ThreadPool来执行您的任务。在任何情况下,您都可以使用非阻塞I/O(NIO),看看NettyJetty项目支持它。

现在Connection2: Client1 --file--> Client2

使用P2P客户端之间将改善性能和服务器的网络资源,但当然你失去匿名性和它要复杂得多。假设聊天对话只在两个用户之间进行(维持一个N-N P2P聊天是一项更为复杂的任务),您可以为客户端设备提供ServerSocket支持,并始终使其中一个用作服务器,另一个用作客户端。

事实上,你可以使用现有的ServerSocket只同步用户(使用某些命令为),并指导用户。只能将此套接字用作用户匹配的服务器。当您需要在两个用户之间发起聊天时,请求其中一个运行ServerSocket,另一个运行客户端套接字。通知他们彼此的IP,并让他们之间进行连接。你的服务器现在只是一个中介,只发起连接。

*如果你运行一个P2P解决方案,为什么不聊天+文件服务使用这个? (如果你不需要记录消息,你可以这样做,这样你的服务器只能做裁判)。

**关于端口号用于P2P,您可能需要设置NAT规则到路由器。

相关问题