1、ServerSocket请求队列长度
Client.java
Server.java
ServerSocket的accept()方法从队列中取出连接请求
服务器队列满了,Client会被拒绝抛出异常
public class Client {
public static void main(String[] args) throws Exception {
final int length = 100;
String host = "localhost";
int port = 8000;
Socket[] sockets = new Socket[length];
for(int i=0;i<length;i++){
sockets[i] = new Socket(host, port);
System.out.println("第"+(i+1)+"次连接成功");
}
Thread.sleep(3000);
for(int i=0;i<length;i++){
sockets[i].close();
}
}
}
public class Server {
private int port = 8000;
private ServerSocket serverSocket;
public Server() throws IOException {
serverSocket = new ServerSocket(port, 3);
System.out.println("服务器启动");
}
public void server(){
while(true){
Socket socket = null;
try {
socket = serverSocket.accept();
System.out.println("New connection accepted"+socket.getInetAddress() + ":" +socket.getPort());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String args[])throws Exception {
Server server=new Server();
Thread.sleep(60000*10); //睡眠十分钟
//server.service();
}
}
2、绑定IP
如果主机有多个IP,可以指定绑定IP
ServerSocket serverSocket = new ServerSocket(8000, 10, InetAddress.getByName("192.168.1.5"));
3、默认构造方法
不带参数的构造方法允许绑定端口前,设置一些方法,比如setReuseAddress()是否立即释放端口。因为这些方法在端口绑定后设置就无效了
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(8000));
4、获取ServerSocket绑定服务器的IP和端口
服务器的匿名端口通过getLocalPort()方法获取
public static void main(String args[])throws IOException{
ServerSocket serverSocket=new ServerSocket(0);
System.out.println("监听的端口为:"+serverSocket.getLocalPort());
}
5、so_timeout
等待客户连接的超时时间
setSoTimeout(int timeout);
getSoTimeout();
当服务器执行accept()方法时,如果设定了超时,超过超时时间会抛出SocketTimeoutException
TimeoutTester.java
public class TimeoutTester {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
serverSocket.setSoTimeout(6000);
Socket socket = serverSocket.accept();
socket.close();
System.out.println("服务器关闭");
}
}
6、so_reuseaddr
setResuseAddress(boolean on);
getResuseAddress();
决定网络上仍有数据向旧的ServerSocket传输数据,是否允许新的ServerSocket绑定到旧的ServerSocket同样的端口上
7、so_rcvbuf
setReceiveBufferSize(int size);
getReceiveBufferSize();
服务端用于接收数据的缓冲区的大小,以字节为单位,设置需要在绑定端口前