推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 进击的Java > 【老生常谈】客户端Socket查漏补缺

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

进击的Java 2018-10-27

被忽视的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查漏补缺》的版权归原作者「进击的Java」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注进击的Java微信公众号

进击的Java微信公众号:gh_96cc4698310e

进击的Java

手机扫描上方二维码即可关注进击的Java微信公众号

进击的Java最新文章

精品公众号随机推荐