套接字点对点
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以上是关于套接字点对点的主要内容,如果未能解决你的问题,请参考以下文章
计算机网络 王道考研2021 第五章:传输层 -- 传输层概述点对点和端对端的区别TCP / UDP概述端口号(传输层的SAP(服务访问点))套接字