服务器套接字的工作原理是什么?

时间:2010-09-07 14:28:12

标签: java sockets networking

服务器套接字的工作原理是什么?当我创建一个java服务器套接字并在端口1234接受连接时。服务器是否实际使用端口1234用于所有客户端?我已经读过,当您编写网络服务器时,套接字实际上会在接受连接后打开另一个端口。

这是真的吗?如果是这样,为什么我没有在netstat中看到它?我看到很多像这样的连接

tcp        0      0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236   ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193  ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012  ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED 

他们真的都在1234连接到我的服务器吗?如果是这样,这是否意味着服务器将能够接受无限数量的连接?

5 个答案:

答案 0 :(得分:3)

  

所以他们真的都和我有关   服务器在1234?

  

如果是这样,那不就意味着你了   服务器将能够接受无限   连接数?

您可以拥有2 ^ 32-2-1(IP4)地址(一个可以在同一网络上拥有另一台主机),以及2 ^ 16个远程套接字端口。这很多,但不是无限的。无论如何,你之前会耗尽内存。

答案 1 :(得分:3)

TCP / IP套接字由元组唯一标识(本地地址,本地端口,远程地址,远程端口)。

这将提供非常多的套接字,但不是无限的。

答案 2 :(得分:2)

是的,你基本上是对的。

服务器正在侦听某个端口(您设置的端口),但是当您接受连接时,它将归属一个新连接的套接字号。

如果您没有使用netstat看到连接的套接字,可能是因为您没有使用正确的选项调用它。您应该在服务器端口上有一个LISTEN连接,并且每个活动远程连接都有一个ESTABLISHED连接和一个分配的本地端口。您还可以使用TIME WAIT状态保留一些终止连接(端接不良)。

以下是我系统当前状态的一些摘录(在Linux上使用netstat -anlp获得)

tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      27002/rdpproxy  
tcp        0      0 10.10.4.185:3389        10.10.4.13:36725        ESTABLISHED 27233/rdpproxy  

服务器是10.10.4.185,正在侦听端口3389.允许任何远程IP和远程端口连接。

第二行显示已连接的会话。远程地址是10.10.4.13,并为此地址保留端口36725。因此,您可以从10.10.4.185(成千上万)开始大量连接,还可以从其他系统开放更多连接。

并且,不,这并不意味着您的服务器将能够接受无限数量的连接,您的系统可能会退出资源,并且无法在该限制之前打开新连接。

答案 3 :(得分:1)

是的,服务器可以接受单个端口上的任意数量的连接。这是服务器和客户端套接字之间的区别,客户端套接字每个端口只能有一个连接。

答案 4 :(得分:0)

这不是无限的。有一个限制。在基于Unix的操作系统上,ulimit命令将告诉您进程可以拥有的“打开文件”的最大数量,并且还允许您更改它。如果超出此限制,您将开始看到与“打开的文件太多”相关的IOExceptions。