关于java Socket setSendBufferSize的一个坑

今天在测试一个问题的时候希望调整java tcp的接收窗口,于是写了一段简单的测试代码:

        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("192.168.0.133", 80));

        socketChannel.socket().setReceiveBufferSize(100);
        socketChannel.socket().setSendBufferSize(100);

        socketChannel.write(ByteBuffer.wrap(
                ("GET / HTTP/1.1\r\n" +
                "Host: 192.168.0.133\r\n" +
                "Accept: */*\r\n" +
                "\r\n").getBytes(Charset.forName("UTF-8"))));
        ByteBuffer byteBuffer = ByteBuffer.allocate(100);
        try {
            while (socketChannel.read(byteBuffer) > 0) {
                byteBuffer.flip();
                String content = Charset.forName("UTF-8").decode(byteBuffer).toString();
                System.out.print(content);
                byteBuffer.clear();           
            }
        } finally {
            socketChannel.close();
        }

本来以为通过将发送和接收窗口设置为100会减小wireshark抓包看到的win, 然而:

第一次抓包结果

这下就有点百思不得骑姐了。查看一下代码,发现在open时同时进行了connect,而后才设置的接收和发送buffer,会不会这里有问题?于是稍微调整了代码一下:

        SocketChannel socketChannel = SocketChannel.open();

        socketChannel.socket().setReceiveBufferSize(100);
        socketChannel.socket().setSendBufferSize(100);

        socketChannel.connect(new InetSocketAddress("192.168.0.133", 80));

        socketChannel.write(ByteBuffer.wrap(
                ("GET / HTTP/1.1\r\n" +
                "Host: 192.168.0.133\r\n" +
                "Accept: */*\r\n" +
                "\r\n").getBytes(Charset.forName("UTF-8"))));
        ByteBuffer byteBuffer = ByteBuffer.allocate(100);
        String content;
        try {
            while (socketChannel.read(byteBuffer) > 0) {
                byteBuffer.flip();
                content = Charset.forName("UTF-8").decode(byteBuffer).toString();
                System.out.print(content);
                byteBuffer.clear();
          }           
        } finally {
            socketChannel.close();
        }

果然再次抓包发现结果符合预期了:

调整后抓包结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,324评论 25 708
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,987评论 1 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,933评论 18 139
  • 原文:https://github.com/electron/electron/blob/master/docs/...
    Shmily落墨阅读 19,133评论 1 5
  • 我来自农村, 因为家境贫穷,为了减轻父母的负担,在职专毕业后没有参加高考,而是选择了就业——南下广东,进了一家...
    曾经像花儿一样阅读 262评论 2 1