【问题标题】:In Java, how to create multiple socket connections to the same specific client?在 Java 中,如何创建到同一个特定客户端的多个套接字连接?
【发布时间】:2015-03-01 16:57:20
【问题描述】:

我正在用 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 地址都是相同的,所以我不能这样做。

【问题讨论】:

  • IRC 很久以前就解决了一半这个问题。看看DCC 是如何处理它的。 (它并不是对 NAT 友好,但除非服务器最终参与传输的每个字节,否则您不会发现太多。)
  • 客户端连接到服务器,而不是反过来。

标签: java multithreading sockets chat


【解决方案1】:

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

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

但是,我不确定你是否在同一个 NIC 上通过两个连接赢得了一些东西。我建议您在收到命令(聊天或其他消息)时区分命令,并使用两个不同的队列(或使用一个队列并为您的任务设置层次结构)为它们提供服务。您也可以使用 ThreadPool 来执行您的任务。

无论如何,您都可以使用非阻塞 I/O (NIO),看看支持它的 NettyJetty 项目。

现在Connection2: Client1 --file--&gt; Client2

在客户端之间使用 P2P 可以提高性能和服务器的网络资源,但是您当然会失去匿名性,而且要复杂得多。假设聊天对话仅在两个用户之间进行(维护 NN P2P 聊天是一项更复杂的任务),您可以为客户端设备配备 ServerSocket 支持,并始终让其中一个作为服务器工作,另一个作为客户端工作。

事实上,您可以使用现有的 ServerSocket 来同步用户(为此使用一些命令)并引导用户。仅将此套接字用作用户匹配服务器。当您需要在两个用户之间发起聊天时,请其中一个运行 ServerSocket,另一个运行客户端套接字。告知他们对方的IP,让他们相互连接。您的服务器现在只是一个中介,只启动连接。

*如果您运行 P2P 解决方案,为什么不将其用于聊天 + 文件服务? (如果您不需要记录消息,您可以这样做,这样您的服务器就只是充当裁判)。

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多