TCP客户端消息累积

时间:2019-05-15 00:16:20

标签: java networking tcp ip

我正在尝试实现一个 TCP 客户端,该客户端每50ms发送一次到服务器。因此,我开发了一个快速的TCP测试程序,可以在该程序中更改每条消息之间的时间,但我并没有真正收到发送X毫秒的消息,正如您在Wireshark捕获中所看到的那样,它们正在累积。有什么想法吗?

由于该TCP流中的前一帧应该接近控制台中在此示例中引入的值,因此该值仅应为一个字母和时间 0.08秒

enter image description here

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);
}

}

1 个答案:

答案 0 :(得分:0)

您可以通过设置套接字选项“ TCP_NODELAY”(本地拼写可能会有所不同)来影响发送方的行为,这样就更有可能立即发送字节(受流控制等),但不会更改TCP的基本性质。

TCP不是面向消息的协议,它是顺序的字节流协议。不能保证单独执行“发送”会在另一端产生相同数量,相同内容的“接收”。经常会发生这种情况,特别是在LAN上,您会倒霉,并且似乎保留了“消息”边界,但不一定如此。

如果您想要消息,则必须发明它们。标准技术:定长消息(听起来像您在做的:长度1),标头给出长度,定界符字节。接收者必须被编码以重建消息。在线打包并不重要。