ServerSocket用法详解
ServerSocket负责接受客户端连接请求
ServerSocket构造:
ServerSocket()
ServerSocket(intport)
ServerSocket(intport, int backlog)
ServerSocket(intport, int backlog, InetAddressbindAddr)
port绑定的端口,backlog客户请求的队列长度,bindAddr服务器绑定的IP地址
(1)绑定端口
a) 构造时会让serverSocket绑定一个端口,无法绑定端口会发出BindException,通常造成这个状况的愿意是端口被其他服务程序占用,有些端口不能被随便使用.
(2)设定客户端请求列队长度
a) 管理客户请求的任务是由操作系统决定的,操作系统把请求储存在FIFO的队列中,当队列满时只有ServerStocket的accept方法获取请求后才能继续向队列加入请求.虽然队列长度是由操作决定的(WIN 为50个),但是ServerStock的队列长度参数是可以覆盖系统规定的长度,但以下几种情况还是会采取系统长度:
i. 大于系统限定的最大长度
ii. 小于等于0
iii.没有采用有长度的构造
(3)绑定IP地址
a) 如果一台机器在局域网内,可以使用局域网的IP地址,使用构造4可以实现自定义绑定IP地址.
(4)Stock和ServerStock的默认构造使用
a) 因为如果绑定了端口有一些设置就无法生效了.比如SO_REUSEADDR,所以需要这种不绑定端口的默认构造,然后使用bind(InetStocketAddress(int)) 方法绑定一个端口
接受和关闭与客户的连接
(1) 使用ServerStock的accept方法从请求列队中取得一个客户连接,如果队列中没有请 求连接的话accept会阻塞.
(2)使用close方法会使得释放占用的端口,isClose方法会检查是否已经关闭.
获取ServerSocket的信息
(1)使用getInetAddress方法获得绑定的Ip地址
(2)使用getLocalPort 方法获得绑定的端口
使用这个方法可以将匿名端口获得(构造绑定端口时设置为0,系统会随即分配一个端口)
ServerSocket选项
(1)SO_TIMEOUT(accept等待延迟时间)
setSoTimeout(int)毫秒做单位,不设置accept会一直阻塞等待下去,而是设置后会在超过等待时间抛出SocketTimeoutException,0是永远不会超时.
(2)SO_REUSEADDR(是否延时关闭)
setReuseAddress(false)同Socket,决定如果网络上仍有数据向旧 ServerSocket传输数据,是否允许新的ServerSocket绑定到旧的ServerSocket 相同的端口上.在bind端口前用
(3)SO_RCVBUF(设置接受缓冲区大小)
setReceiveBufferSize(int)同stock的,单位字节kb