老生常谈客户端Socket查漏补缺

Posted 进击的Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老生常谈客户端Socket查漏补缺相关的知识,希望对你有一定的参考价值。

被忽视的Socket选项

TCP_NODELAY

setTcpNodelay(true) 关闭Socket的缓冲。此功能有点类似于flush。即不使用缓存而是直接将数据包推送给服务端。

SO_LINGER

setSoLinger(true , 200) 表示当Socket关闭后,等待200秒,等待数据发送和接收回应。当设置为0时,那么当Socket关闭时,所有未发送的数据都会被丢弃。

SO_TIMEOUT

此功能大家用的应该比较多,表示read()阻塞时间。

SO_RECVBUF

从名字即可以看出此功能主要是设置用于网络输入的建议接收缓冲区大小。根据Socket用途设置此值,可以适当的提高效率,如Socket传输的是小报文,则可以将此值设置为较小如2K。如果是大一点的报文,可以设置为16K。

SO_SENDBUF

同SO_RECVBUF,不同时的用于设置输出的建议缓冲区大小。

SO_KEEPALIVE

启用此方法,Socket会在空闲时发送一个数据包以确保服务器在线(一般是2小时)。如果服务器无响应,客户端会持续11分钟,在第12分钟的时候,如果未收到响应,客户端就关闭Socket。

SO_REUSEADDR

注意:要使用此方法只能使用无参构造函数,然后利用无参构造获取到的对象调用setReuseAddress函数,同时前一个Socket与后一个Socket必须都设置setReuseAddress为true。

客户端的自动重连小例子

public class SocketClient {

    static Socket socket = null;

    public static Socket getSocket() {
        socket = new Socket();
        try {
            socket.setKeepAlive(true);
            socket.connect(new InetSocketAddress("127.0.0.1",10002));
            System.out.println("客户端已经连接上了");
        } catch (IOException e) {
            System.out.println("Socket连接服务端错误: " + e.getMessage());
        }
        return socket;
    }

    public static void main(String[] args) {
        while ((socket = getSocket()) != null) {
            try {
                OutputStream os = socket.getOutputStream();
                os.write("success".getBytes());
                InputStream is = socket.getInputStream();

                byte[] bt = new byte[3];

                while(is.read(bt)  != -1){
                    System.out.println("收到的数据为:"+new String(bt));
                }

                System.out.println("服务端断开了。。。。。。。");

                is.close();
                os.close();

            } catch (IOException e) {
                System.out.println("Socket连接服务端错误,等待3秒钟重连 : " + e.getMessage());
            } finally{
                if(socket != null)
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
            try {
                Thread.sleep(1000 * 3);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }

    }
}


以上是关于老生常谈客户端Socket查漏补缺的主要内容,如果未能解决你的问题,请参考以下文章

nginx之查漏补缺

第四周查漏补缺

20165329 第一周查漏补缺

JavaScript查漏补缺 —数组中filter()方法

webpack5 - 查漏补缺 2

webpack5 - 查漏补缺 2