ServerSocket
在Java中,服务器程序的基本生命周期
- 使用一个ServerSocket()构造函数在一个特定端口创建一个新的ServerSocket。
- ServerSocket使用其accept()方法监听这个端口的入站连接。accept()会一直阻塞,直到一个客户端尝试建立连接,此时accept()将返回一个连接客户端和服务器的Socket对象。
- 根据服务器的类型,会调用Socket的getInputStream()方法或getOutputStream()方法,或者这两个方法都调用,以获得与客户端通信的输入和输出流。
- 服务器和客户端根据已协商的协议交互,直到要关闭连接
- 服务器或客户端(或二者)关闭连接
- 服务器返回到步骤2,等待下一次连接
构造
- public ServerSocket()
创建非绑定服务器套接字。 - public ServerSocket(int port)
创建绑定到特定端口的服务器套接字。 - public ServerSocket(int port,int backlog)
利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。 - public ServerSocket(int port,int backlog,InetAddress bindAddr)
使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
参数:
port - 本地TCP端口,当为0时表示选择任意端口
backlog - 队列的最大长度
bindAddr - 要将服务器绑定到的InetAddress
连接
- public Socket accept()
侦听并接受到此套接字的连接。 - public void bind(SocketAddress endpoint)
将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 - public void bind(SocketAddress endpoint,int backlog)
将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
参数:
endpoint - 要绑定的 IP 地址和端口号。
backlog - 队列的最大长度。
获取ServerSocket信息
- public InetAddress getInetAddress()
返回此服务器套接字的本地地址。如果套接字是未绑定的,则返回 null。 - public int getLocalPort()
返回此套接字在其上侦听的端口。 如果尚未绑定套接字,则返回 -1。 - getLocalSocketAddress
返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。
状态
- public boolean isClosed()
返回 ServerSocket 的关闭状态。 - public boolan isBound()
返回 ServerSocket 的绑定状态。
Socket选项
- SO_TIMEOUT
SO_TIMEOUT是accept()在抛出java.io.INterruptedIOException异常前等待入站连接的时间,以毫秒计,如果为0,表示永远不会超时
使用public void setSoTimeout(int timeout)修改
使用public int getSoTimeout()查询 - SO_REUSEADDR
与Socket的SO_REUSEADDR选项类型,它确定了是否允许一个新的Socket绑定到之前使用过的一个端口
使用public void setReuseAddress(boolean on)修改
使用public boolean getReuseAddress()查询 - SO_RCVBUF
SO_RCVBUF选项设置了ServerSocket接受的客户单Socket默认接收缓冲区大小
设置大于64kb的接收缓冲区大小必须在绑定之前设置
使用public void setReceiveBufferSize(int size)修改
使用public int getReceiveBufferSize()查询 - public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)
设置此 ServerSocket 的性能首选项。
参数:
connectionTime - 表明短连接时间的相对重要性的 int
latency - 表明低延迟的相对重要性的 int
bandwidth - 表明高带宽的相对重要性的 int