博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.net.ServerSocket 解析
阅读量:6971 次
发布时间:2019-06-27

本文共 1785 字,大约阅读时间需要 5 分钟。

 

作者:jijs

链接:
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

构造

  1. public ServerSocket()

    构造一个ServerSocket,但不绑定任何端口,所以也不能接受任何的请求连接。以后可以通过bing()方法来进行绑定。

  2. public ServerSocket(int port)

    通过一个端口来构造一个ServerSocket对象。
    默认的tcp队列大小为50.
    默认监听本地所有的ip地址(如果有多个网卡)。

1 TCP分为全连接队列和半连接队列。这里说的是全连接队列  2 半连接队列:第一次握手,服务器收到客户端的请求时,该请求连接放到半连接队列中。  3 全连接队列:已经通过三次握手后,把当前连接信息存放到全连接队列中。全连接队列中的连接等待ServerSocket.accpt()处理。
  1. public ServerSocket(int port, int backlog)

    通过一个端口和TCP队列大小来构造一个ServerSocket对象。
    默认监听本地所有的ip地址(如果有多个网卡)。

  2. public ServerSocket(int port, int backlog, InetAddress bindAddr)

    通过一个端口、TCP队列大小和一个InetAddress 来构造一个ServerSocket对象。

一个服务器可能有多个网卡,多个ip地址,通过此构造传入一个InetAddress ,可以只监听从此网卡过来的请求连接。

比如:一个电脑上有两个网卡,一个是外网地址,一个是内网地址。为了安全此ServerSocket只允许监听内网ip地址的请求,而不接收外网请求。

bind 方法

通过无参构造的ServerSocket对象,需要bing方法进行绑定操作才能处理客户端的请求。

1 public void bind(SocketAddress endpoint) throws IOException {  2     bind(endpoint, 50);  3 }  4   5 public void bind(SocketAddress endpoint, int backlog) throws IOException {  6 ...  7 }
  1. 通过SocketAddress 进行绑定,默认TCP队列大小为50。
  2. 通过SocketAddress 和 TCP请求队列大小 两个参数 进行绑定。

accept 方法

1 public Socket accept()

该方法会从全连接队列中获取一个客户端Socket请求。该方法是阻塞方法。如果当前没有请求的连接,则会一直阻塞,直到有客户端连接请求为止。

获取ServerSocket相关信息

  1. public InetAddress getInetAddress()

    获取本地地址,如果本地有多个ip,随机返回一个。
  2. public int getLocalPort()
    获取绑定的端口。

如果构造ServerSocket中默认端口传入一个0,则是随机生成一个端口,这时就需要使用此方法来获取端口信息。

  1. public SocketAddress getLocalSocketAddress()
    返回本地地址和端口。

 

通过源码发现该方法内部获取本地地址是通过调用getInetAddress()方法进行获取的。获取端口是通过getLocalPort()方法获取的。

使用ServerSocket 判断当前系统已经占用的端口

1 public static void main(String[] args) throws Exception {  2     for(int port=1; port<65535; port++){  3         try{  4             ServerSocket s = new ServerSocket(port);  5         }catch(IOException e){  6             System.out.println("当前系统中已经使用的端口:"+port);  7         }  8     }  9 }

运行结果如下:

你可能感兴趣的文章
C# 使用 iTextSharp 将 PDF 转换成 TXT 文本
查看>>
初学 Python(十一)——切片
查看>>
lower_bound
查看>>
Python_基础_(正表达式)
查看>>
C++字符串的输入
查看>>
Scrapy安装报错
查看>>
github开源文章生成pdf
查看>>
JavaEE(24) - JAAS开发安全的应用
查看>>
DDD领域驱动设计基本理论知识总结
查看>>
Python操作Redis数据库
查看>>
equals() 和 hashCode()
查看>>
<原创>在PE最后一节中插入补丁程序(附代码)
查看>>
简单的随笔 ,WSDL工具,Oracle备份还原,java调用.net webservice
查看>>
Workman websocket 握手连接
查看>>
[洛谷P1901]发射站
查看>>
cordova封装h5为app,cookie不可用解决方法
查看>>
mysql limit 优化
查看>>
谈恋爱与形象
查看>>
day22 Pythonpython 本文xml模块
查看>>
Fisher's exact test( 费希尔精确检验)
查看>>