0

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

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

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

4

2 回答 2

2

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

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

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

但是说服自己的最好方法是在你的应用程序中添加日志并自己尝试。

于 2012-07-27T16:22:55.700 回答
2

您正在混淆侦听或服务器、套接字和已连接的套接字。

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

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

于 2012-07-27T16:23:30.440 回答