我正在尝试实现一个 TCP 客户端,该客户端每50ms发送一次到服务器。因此,我开发了一个快速的TCP测试程序,可以在该程序中更改每条消息之间的时间,但我并没有真正收到发送X毫秒的消息,正如您在Wireshark捕获中所看到的那样,它们正在累积。有什么想法吗?
由于该TCP流中的前一帧应该接近控制台中在此示例中引入的值,因此该值仅应为一个字母和时间 0.08秒
public class TCPClient {
static Socket clientSocket;
static DataOutputStream outToServer;
public static class enviar extends TimerTask {
public void run() {
try{
outToServer.writeBytes("a");
System.out.println("Packet Sent");
}catch(Exception e){
System.out.println(e);
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int tiempo = 1000;
System.out.print("Tiempo: ");
tiempo = scanner.nextInt();
try{
clientSocket = new Socket("192.168.1.21", 1337);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
}catch(Exception e){
System.out.println(e);
}
Timer timer = new Timer();
timer.schedule(new enviar(), 0, tiempo);
}
}
答案 0 :(得分:0)
您可以通过设置套接字选项“ TCP_NODELAY”(本地拼写可能会有所不同)来影响发送方的行为,这样就更有可能立即发送字节(受流控制等),但不会更改TCP的基本性质。
TCP不是面向消息的协议,它是顺序的字节流协议。不能保证单独执行“发送”会在另一端产生相同数量,相同内容的“接收”。经常会发生这种情况,特别是在LAN上,您会倒霉,并且似乎保留了“消息”边界,但不一定如此。
如果您想要消息,则必须发明它们。标准技术:定长消息(听起来像您在做的:长度1),标头给出长度,定界符字节。接收者必须被编码以重建消息。在线打包并不重要。