java网络编程学习笔记(三):ServerSocket详解
1.ServerSocket的构造方法
ServerSocket();
ServerSocket(int port);
ServerSocket(int port,int backlog);
ServerSocket(int port,int backlog,InetAddress bindAddr);
在以上的构造方法中,参数port指定服务器绑定的端口(服务器要监听的端口),参数backlog指定客户连接请求队列的长度,参数bindAddr指定服务器要绑定的IP地址。
但是在有参数的构造函数中,如果绑定窗口出错会抛出IOException,实际上抛出的是BindException,出现该异常的主要原因有两个:
第一,端口被别的进程所占用;第二,如果将要占用的端口在1~1023之间,但是自己不是超级用户,所以没有权限去分配这些端口。
如果把参数port设置为0,表示由操作系统为服务器分配一个任意可用的端口,由操作系统分配的端口也称为匿名端口。一般不使用匿名端口,因为客户端程序需要明确知道服务器的端口以便进行连接。
2.设定客户连接请求队列的长度
当服务器运行时,可能会同时监听到多个客户的连接请求。
管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进先出的队列中。许多操作系统限定了队列的最大长度,一般为50.当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通过ServerSocket的accept()方法从队列中取出连接请求,是队列腾出空位置时,队列才能继续加入新的请求。
ServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度,它将覆盖操作系统限定的队列的最大长度。不过在以下几种情况中仍会使用操作系统限定的队列最大长度:第一,backlog参数的值大于操作系统限定的队列最大长度;第二,backlog的值小于或等于0;第三,在ServerSocket构造方法中没有设置backlog参数。
3.ServerSocket的默认构造方法
ServerSocket有一个默认的构造方法,通过该方法构造的ServerSocket不与任何端口绑定,如果需要使用还得使用bind()与特定端口进行绑定。
4.接收和关闭与客户的连接
ServerSocket的accept()方法 从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()就会一直等待,直到收到了连接请求才返回。