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

标签 java networking tcp client-server nio

我觉得这些可能是基本主题,但我找不到其他地方对它们进行简洁的回答。

当构建一个 TCP 服务器时,我的理解是每个连接的客户端都必须被分配到它自己的端口以保持合理的连接(例如知道这个消息来自这个客户)。

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

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

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

最佳答案

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

您可以使用Selector 来管理这些套接字。您将选择器配置为监听母套接字以及您创建的任何其他套接字。这样,您可以让一个线程监听所有传入的通信。如果新通信在母套接字上,则接受连接并生成一个新套接字并将其添加到选择器。如果新的通信是在其他套接字之一上进行的,那么您将适本地处理该消息。

我总是编写自己的网络代码。这是一种有用的学习体验,但您也确切地知道这些东西在做什么。

关于java - 如何在(基于 Java 的)TCP 中处理多个客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936654/

相关文章:

Python UDP recvfrom()具体地址

c - 如何从 TCP header 打印序列和确认号

java - 使用Java中aws配置文件中定义的role_arn

java - CardView cardElevation 在 CardView 内部绘制随机方 block

java - 将 Wordnet 加载到 Neo4j 中

networking - sshuttle 如何避免 TCP-over-TCP 诅咒?

Python:SocketServer 意外关闭 TCP 连接

java - JPA where 子句

iphone - 我可以在特定时刻阻止网络访问吗?

linux - 如何从 docker 容器管理主机网络命名空间