【问题标题】:Unexpected 40ms ping意外的 40 毫秒 ping
【发布时间】:2014-07-13 05:27:02
【问题描述】:

我遇到了一个奇怪的问题,我不知道发生了什么。 所以基本上,当我尝试通过交换浮点数(使用 DataInputStream 和 DataOutputStream)在服务器和客户端之间建立一个简单的连接时,似乎有一个固定的 ping 限制,在三台不同的计算机上使用 openjdk 正好是 40 毫秒。

此外,我尝试更改发送浮点数的方式:

outs.write(ByteBuffer.allocate(4).putFloat(3.14f).array(), 0, 4);

它应该做同样的事情:

outs.writeFloat(3.14f);

这个奇怪的 ping 限制竟然消失了!

也许我对以下代码做错了什么:

客户端

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.nio.ByteBuffer;

public class client {

    private Socket sock;
    private DataOutputStream outs;
    private DataInputStream ins;

    public client() throws IOException{
        byte c;

        sock = new Socket(InetAddress.getByName("localhost"),9998); 
        outs = new DataOutputStream(sock.getOutputStream());
        ins = new DataInputStream(sock.getInputStream());

        do{
            long start = System.currentTimeMillis();

            /* here is the thing */
            //outs.write(ByteBuffer.allocate(4).putFloat(3.14f).array(), 0, 4); // either this outs
            outs.writeFloat(3.14f); // or this one

            outs.flush();
            c = ins.readByte();
            long stop = System.currentTimeMillis();
            System.out.println("elapsed time: "+(stop-start)+"ms");

        }while(c == (byte) 1);
    }

    public static void main(String[] args) {
        try{
          client client = new client();
        } catch(SocketException e){
            System.out.println("Socket disconnected");
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

}

服务器

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.DataInputStream;

public class server extends Thread{

    private DataOutputStream outs;
    private DataInputStream ins;

    public server(Socket sock) throws IOException{
        System.out.println("client connected");
        outs = new DataOutputStream(sock.getOutputStream());
        ins = new DataInputStream(sock.getInputStream());
    }

    public void run(){
        try{
            while(true){
                float f = ins.readFloat();
                System.out.println("value: "+f);
                outs.writeByte((byte) 1);
                outs.flush();
            }
        } catch (IOException e) {
            System.out.println("client disconnected");
        }
    }

    public static void main(String[] args) {
        try{
            ServerSocket serverSock = new ServerSocket(9998);

            while(true){
                server server = new server(serverSock.accept());
                server.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

这给了我(在本地主机上)通常的 writeFloat:

经过时间:40ms

使用 write():

经过时间:0ms

编辑:

显然,Mike's 的回答似乎解决了这个问题! writeFloat 不再有 40 毫秒的延迟...

【问题讨论】:

    标签: java sockets ping


    【解决方案1】:

    窗户?尝试增加您发送的字节数。 Windows TCP/IP 堆栈中存在(或曾经是)一个限制,它会等待一段时间 get 获取更多字节以获取要发送的完整包。

    【讨论】:

    • 嗯,不是真的:只在ubuntu、ubuntu和debian上测试过……反正我想到了一种在发送前等待填充的缓冲区,但我使用的是flush方法!或者,它在 tcp/ip 协议中更深,但为什么它会与其他 write() 技巧一起使用?
    • 尝试设置 tcp nodelay 套接字选项。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2022-10-25
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多