gpt4 book ai didi

java - 意外 40 毫秒 ping

转载 作者:行者123 更新时间:2023-12-01 12:56:35 26 4
gpt4 key购买 nike

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

此外,我尝试更改发送 float 的方式:

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:

elapsed time: 40ms

其他情况下使用write():

elapsed time: 0ms

编辑:

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

最佳答案

Windows?尝试增加发送的字节数。 Windows TCP/IP 堆栈中存在(或曾经)限制,该限制需要等待一段时间才能获取更多字节才能发送完整的包。

关于java - 意外 40 毫秒 ping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23836238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com