2012-07-27 64 views
0

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

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

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

回答

2

你描述的问题不会发生,因为TCP是一个“连接”协议,这基本上意味着两个对等方必须在发生任何事情之前进行协商。之后,TCP控制数据包的顺序以确保它们以正确的顺序到达目的地。顺便说一下,TCP代表传输控制协议,因此它强调确保你描述的内容不会发生。 UDP的情况并非如此。

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

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

但说服自己的最好方法是将日志记录添加到您的应用程序并自行尝试。

+0

+1。此外,serverSocket应该只监听预定义端口上的传入连接;所有进一步的通信之间的通信将随机(但预先安排)端口完成。 – Shark 2012-07-27 16:32:36

+0

@Shark否。在服务器端,接受的套接字使用与监听套接字相同的本地端口。不需要预先安排。有关ServerSocket应该做什么的部分甚至没有意义,因为它当然不能做其他事情。 – EJP 2012-07-30 00:57:40

2

你很困惑收听或服务器,插座和连接插座。

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

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