使用 TCP 处理多个线程

Posted

技术标签:

【中文标题】使用 TCP 处理多个线程【英文标题】:Handling Multiple threads with TCP 【发布时间】:2012-07-27 16:10:12 【问题描述】:

我正在尝试实现一个聊天应用程序,并在设计上选择使用 TCP 或 UDP 进行对等方之间的消息交换。我想使用 TCP,但遇到以下问题。

问题场景: 对等点 A 正在侦听一个众所周知的端口(例如 5555)。当对等体 B 想向对等体 A 发送消息时,它连接到 A 上的端口 5555。对等体 A 接受该连接并启动一个新线程来处理与对等体 B 的通信,以便其他对等体(例如对等体 C)能够连接到对等体 A 的 5555 端口。现在的问题是它不是请求/响应协议,所以我很困惑,如果对等点 A 出于任何原因没有回复对等点 B,那么 B 发送的后续消息将被传递到对等点 A 的 5555 端口?并且对等点 A 将为收到的每条消息创建单独的线程?

使用 UDP 可能会解决这个问题,我不必创建单独的线程来与每个对等方通信,每个人都可以将消息发送到同一个众所周知的端口。但我想使用 TCP 来保证消息将被传递。有什么想法可以解决这个问题并只使用一个线程与一个对等方进行通信?

【问题讨论】:

【参考方案1】:

您描述的问题不会发生,因为 TCP 是一个“连接”协议,这基本上意味着两个对等方必须在其他任何事情发生之前协商通信。之后,TCP 控制数据包的顺序以确保它们以正确的顺序到达目的地。顺便说一句,TCP 代表传输控制协议,因此它非常重视确保您所描述的事情不会发生。 UDP 完全不是这样。

一旦您的ServerSocket 接受了来自客户端Socket 的连接,协商就完成了,TCP 流专用于该通信。

创建新连接的唯一方法是您的客户端通过新的 Socket 发出另一个连接。

但说服自己的最佳方法是在您的应用中添加日志记录并自己尝试。

【讨论】:

+1。此外,serverSocket 应该只监听预定义端口上的传入连接;对等方之间的所有进一步通信都将在随机(但预先安排好的)端口上完成。 @Shark 否。在服务器端,接受的套接字使用与侦听套接字相同的本地端口。也不需要预先安排。关于 ServerSocket 应该做什么的部分甚至没有意义,因为它当然不能做任何其他事情。【参考方案2】:

你混淆了listening,或者服务器、sockets和connectedsockets。

一旦在侦听端接受 TCP 连接,两方之间就有一个全新的全双工套接字,因此它们可以交换数据。监听套接字的唯一目的是接受连接,没有应用程序数据流过这些连接。

您可以将新连接的套接字交给线程,但您当然不必这样做 - 您可以在单个线程中处理许多非阻塞套接字,我相信 Java NIO 包正是为此而创建的。

【讨论】:

以上是关于使用 TCP 处理多个线程的主要内容,如果未能解决你的问题,请参考以下文章

TCP服务器如何使用select处理多客户连接

廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?

Python网络编程之多任务版TCP服务端程序开发

如何在不阻塞主线程的情况下使用 join() 创建多个 C++ 线程?

Socket 多线程编程