套接字点对点

Posted

技术标签:

【中文标题】套接字点对点【英文标题】:Sockets peer-to-peer 【发布时间】:2014-04-25 15:35:46 【问题描述】:

我正在做一个带有套接字的聊天桌面应用程序,我的目的是在客户端之间创建点对点通信。我的问题是这样的:

如果我拥有所有 IP 地址,我可以在它们之间同时连接客户端吗?

在我的项目中,每个客户端都有服务器套接字和套接字(客户端)。

例如client_1在1001端口监听连接,但同时可以连接到其他不同IP的客户端,监听不同的端口。

现在我想知道的是,如果有经验的人可以告诉它,如果我连接到一个客户端但其他客户端连接到我,是否可以连接到某个客户端并同时接收来自其他客户端的消息?

如果 Client_A 监听 1001 端口但想与 Client_B 聊天,则它通过指定 IP 和端口将自己连接到 Client_B;现在,Client_A 可以同时接收来自连接到他端口的其他客户端的消息吗?可能吗?

如果有人可以帮助我,我也可以发布我的代码;但我认为这是我必须在这里解决的逻辑问题。

非常感谢。

【问题讨论】:

对所有大写标题投反对票。 值得注意的是,您所描述的就是所谓的网状网络,即每个人都与每个人相连的网络。是的,网状网络可以工作,但它们不能很好地扩展(例如,有数百个客户端),所有对等点都需要正确配置它们的 NAT/防火墙。 en.wikipedia.org/wiki/Mesh_networking 【参考方案1】:

听起来您在使用 socket 架构 时有些吃力。架构中的每个套接字对将由一对唯一的 IP 地址确定。 Wikipedia says:

通信本地和远程套接字称为套接字对。每个 套接字对由一个独特的 4 元组描述,包括源和 目标 IP 地址和端口号,即本地和远程 套接字地址。3[4] 正如在上面的讨论中看到的,在 TCP 在这种情况下,每个唯一的套接字对 4 元组都被分配一个套接字号

另外,根据this *** answer:

简单地说,如果我从我的客户端两次连接到同一个 Web 服务器, 从我的角度来看,两个连接将有不同的源端口 和来自 Web 服务器的目标端口。所以没有歧义, 即使两个连接具有相同的源 IP 和目标 IP 地址。

您的点对点聊天客户端网络绝对可以工作,并且客户端确实可以将他们收到的消息联合到其他客户端。您很可能希望使用 GUID 标记每条消息,这样客户端就不会多次处理同一条消息。

也许更有用的架构是发布/订阅架构。 PubNub 等实时网络允许您将消息发布到全局频道,并在订阅该频道的客户端上接收这些消息。在您的情况下,使用their Java SDK,发布消息非常简单:

Callback callback = new Callback() 
  public void successCallback(String channel, Object response) 
    System.out.println(response.toString());
  
  public void errorCallback(String channel, PubnubError error) 
    System.out.println(error.toString());
  
;
pubnub.publish("demo", "Hello World !!" , callback);

我希望这会有所帮助。干杯!

【讨论】:

感谢您的回答。事实上,我是第一次使用套接字,第一次创建多线程架构很困难。我创建了一个通信协议,每个客户端都有一个 ID。此外,每个客户端都侦听自己的端口,以便从其他客户端获取消息。这篇文章对我很有帮助link

以上是关于套接字点对点的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 通过互联网的点对点连接

点对点epoll客户端和死锁

计算机网络 王道考研2021 第五章:传输层 -- 传输层概述点对点和端对端的区别TCP / UDP概述端口号(传输层的SAP(服务访问点))套接字

我要一份用java网络编程写的点对点的两人聊天程序(TCP和UDP)?

Centos zeromq 消息队列 安装

nodejs 实现套接字服务