如何在(基于Java)TCP中处理多个客户端?

时间:2012-06-07 17:16:59

标签: java networking tcp client-server nio

我觉得这些可能是基本话题,但我在其他地方找不到简洁的答案。

在构建TCP服务器时,我的理解是每个连接客户端必须与其自己的端口进行养殖以保持合理的连接(例如,知道消息来自这个客户端)。

如何设置它?我假设你有一个List和一个人们连接的专用“入口点”Socket。连接Socket会找到一个空闲端口,用端口号回复,并设置一个新的Socket监听该端口。这听起来不错吗?

如果是这种情况,在我看来,在收听传入连接时,条目Socket需要阻塞。这个阻塞读取是在一个单独的线程上完成的吗?

附加的问题:我真的只需要一些简单的消息传递来进行我想要试验的基本Java游戏。像Netty这样的东西对于这个应用程序的特殊核桃而言似乎是一把大锤。我最好使用Java标准库编写好的和轻量级的东西吗?

2 个答案:

答案 0 :(得分:1)

主套接字称为“母套接字”,您可以阻止它等待新连接。当发生新连接时,使用accept()方法为新客户端创建一个新套接字。

您可以使用Selector管理这些套接字。您配置选择器以侦听母插座以及您创建的任何其他套接字。这样,您可以让一个线程监听所有传入的通信。如果新通信位于母插座上,则接受连接并生成新套接字并将其添加到选择器。如果新通信位于其他套接字上,则可以适当地处理该消息。

我总是写自己的网络代码。这是一种有用的学习体验,但您也确切知道这些事情的作用。

答案 1 :(得分:1)

客户端继续使用相同的TCP目标端口。 TCP堆栈基于IP地址和端口(由客户端随机选择)处理多个连接。不过,你真的不需要关心这一点。请参阅Oracle Java IO教程,了解如何处理将连接切换到单独的线程,它们相当不错。