三. ServerSocket用法

一.构造ServerSocket

  1. 构造方法
    (1)new ServerSocket( )
    (2)new ServerSocket(int port,int backlog)
    (3)new ServerSocket(int port,int backlog,InetAddress bindAddr)

    除第一种方法外,其他都会立即尝试绑定端口.第一种方便添加ServerSocket的参数,bind(SocketAddress address)手动绑定端口

  2. 设定客户端连接请求队列长度
    管理客户连接请求的任务是操作系统完成的,操作系统把连接请求存在一个队列中.该队列默认长度为50,当超过这个队列的长度限制时,操作系统会拒绝新的客户端连接请求.只有当ServerSocket的accept()方法从就绪队列中取出连接,使得队列有空位置时才能继续加入新请求.
    SoerSocket构造方法中的backlog参数显式指定请求队列的长度.当一下2种情况,该参数值无效 :
    (1)backlog值 > 操作系统的最大队列长度
    (2)backlog参数值小于等于0

  3. 关闭ServerSocket
    Serversocet的close( )方法是服务器释放占用的端口,并断开与所有客户的连接.当开启ServerSocket的线程执行完毕,ServerSocket会自动关闭.只要一个ServerSocket对象与一个端口绑定过,无论其是否已经close,isBound()方法永远返回true.所以判断ServerSocket是否正在与端口绑定:

    serverSocket.isBound() && !serverSocket.isClosed()
    

二. ServerSocket选项

  1. SO_TIMEOUT
    该参数表示ServerSocket的accept()方法等待客户端连接的超时时间,该值默认为0,永不超时. 服务器的ServerSocket的accecpt()方法在没有客户端连接请求时会阻塞,只有接受了一个客户端请求,才能从accecpt()方法返回.setServerSocket(6*1000)表示accept()方法在阻塞6秒后一定返回,若没有客户端连接,抛出SocketTimeoutExeption
  2. SO_REUSEADDR选项
  3. SO_RCVBUF选项
    设定接收数据的缓冲区大小