ServerSocket选项

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();
服务端用于接收数据的缓冲区的大小,以字节为单位,设置需要在绑定端口前

  

posted @ 2016-06-24 09:23  轻云沉峰  阅读(438)  评论(0)    收藏  举报