Java ServerSocket类的用法(附带实例)
Java 中的 ServerSocket 类实现了服务器端套接字。ServerSocket 对象监听网络中来自客户机的服务请求,根据请求建立连接,并根据服务请求运行相应的服务程序。
创建 ServerSocket 对象的示例代码如下:
创建了一个 ServerSocket 对象 serverSocket,并将服务绑定在 2010 号端口:
注意,这里的 10 是队列长度,并不是只能最多 10 个客户端。实际上,即使是 1000 个客户端连接这台服务器,只要这 1000 个客户端不是在极短的时间片内同时访问,服务器也能正常工作。
【实例】使用 ServerSocket 类获取服务器的状态信息。
Java ServerSocket类的构造方法
ServerSocket():用于创建非绑定服务器套接字; ServerSocket(int port):创建绑定到特定端口的服务器套接字; ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字,并将其绑定到指定的本地端口号; ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
- port 为端口号;若端口号的值为 0,表示使用任何空闲端口。
- backlog 指定服务器所能支持的最长连接队列。如果队列满时收到连接指示,则拒绝该连接。
- indAddr 是要将服务器绑定到的 InetAddress,bindAddr 参数可以在 ServerSocket 的多宿主主机(multi-homed host)上使用,ServerSocket 仅接受对其地址之一的连接请求。如果 bindAddr 为 null,则默认接受任何/所有本地地址上的连接。
创建 ServerSocket 对象的示例代码如下:
ServerSocket serverSocket = new ServerSocket(2010);
创建了一个 ServerSocket 对象 serverSocket,并将服务绑定在 2010 号端口:
ServerSocket serverSocket2 = new ServerSocket(2010, 10);创建了一个 ServerSocket 对象 serverSocket2,并将服务绑定在 2010 号端口,最长连接队列为 10。
注意,这里的 10 是队列长度,并不是只能最多 10 个客户端。实际上,即使是 1000 个客户端连接这台服务器,只要这 1000 个客户端不是在极短的时间片内同时访问,服务器也能正常工作。
Java ServerSocket类的常用方法
方法 | 描述 |
---|---|
Socket accept() | 侦听并接受此套接字的连接。 |
void bind(SocketAddress endpoint) | 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 |
void bind(SocketAddress endpoint, int backlog) | 在有多个网卡(每个网卡都有自己的 IP 地址)的服务器上,将 ServerSocket 绑定到特定地址(IP 地址和端口号),并设置最长连接队列。 |
void close() | 关闭此套接字。 |
InetAddress getInetAddress() | 返回此服务器套接字的本地地址。 |
int getLocalPort() | 返回此套接字在其上侦听的端口。 |
SocketAddress getLocalSocketAddress() | 返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。 |
boolean isBound() | 返回 ServerSocket 的绑定状态。 |
boolean isClosed() | 返回 ServerSocket 的关闭状态。 |
String toString() | 作为 String 返回此套接字的实现地址和实现端口。 |
【实例】使用 ServerSocket 类获取服务器的状态信息。
import java.io.*; import java.net.ServerSocket; public class ServerSocketTest { public static void main(String args[]) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(2010); System.out.println("服务器端口:" + serverSocket.getLocalPort()); System.out.println("服务器地址:" + serverSocket.getInetAddress()); System.out.println("服务器套接字:" + serverSocket.getLocalSocketAddress()); System.out.println("是否绑定连接:" + serverSocket.isBound()); System.out.println("连接是否关闭:" + serverSocket.isClosed()); System.out.println("服务器套接字详情:" + serverSocket.toString()); } catch (IOException e) { System.out.println(e); } } }程序运行结果为:
服务器端口:2010
服务器地址:0.0.0.0/0.0.0.0
服务器套接字:0.0.0.0/0.0.0.0:2010
是否绑定连接:true
连接是否关闭:false
服务器套接字详情:ServerSocket[addr=0.0.0.0/0.0.0.0,localport=2010]