java - 使用 TCP 处理多线程

标签 java sockets tcp network-programming chat

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

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

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

最佳答案

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

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

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

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

关于java - 使用 TCP 处理多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691636/

相关文章:

使用套接字复制目录

ios - Bonjour 在公共(public) Wifi 上失败

java - 通过套接字将 Java 文件对象发送到服务器

sockets - 关闭/关闭对 TCP 接收缓冲区的影响

java - 将对象从 Activity 传递到 Service,该对象不能实现 Serialized 或 Parcelable

java - 未由 S3FileSystem FileSystem 实现 Hadoop Jar 实现

java - fork /加入 : optimal threads count

java - SQL 速度慢,需要帮助。我应该走进内存吗?

c - TCP 代码中出现未初始化值错误

c - C 中 Socket 中的大文件传输错误