前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java.net.ServerSocket 解析

java.net.ServerSocket 解析

作者头像
java404
发布2018-05-18 12:17:36
8050
发布2018-05-18 12:17:36
举报
文章被收录于专栏:java 成神之路

构造

  1. public ServerSocket() 构造一个ServerSocket,但不绑定任何端口,所以也不能接受任何的请求连接。以后可以通过bing()方法来进行绑定。
  2. public ServerSocket(int port) 通过一个端口来构造一个ServerSocket对象。 默认的tcp队列大小为50. 默认监听本地所有的ip地址(如果有多个网卡)。

TCP分为全连接队列和半连接队列。这里说的是全连接队列 半连接队列:第一次握手,服务器收到客户端的请求时,该请求连接放到半连接队列中。 全连接队列:已经通过三次握手后,把当前连接信息存放到全连接队列中。全连接队列中的连接等待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方法进行绑定操作才能处理客户端的请求。

代码语言:javascript
复制
public void bind(SocketAddress endpoint) throws IOException {
    bind(endpoint, 50);
}

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

accept 方法

代码语言:javascript
复制
public Socket accept()

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

获取ServerSocket相关信息

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

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

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

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

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

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    for(int port=1; port<65535; port++){
        try{
            ServerSocket s = new ServerSocket(port);
        }catch(IOException e){
            System.out.println("当前系统中已经使用的端口:"+port);
        }
    }
}

运行结果如下:

运行结果


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构造
  • bind 方法
  • accept 方法
  • 获取ServerSocket相关信息
  • 使用ServerSocket 判断当前系统已经占用的端口
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档