首页 > 解决方案 > TCP客户端消息累积

问题描述

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

它应该只有一个字母 a 和Time,因为这个 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);
}

}

标签: javanetworkingtcpip

解决方案


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

TCP 不是面向消息的协议,它是一个顺序字节流协议。不能保证单独执行“发送”会在另一端产生相同数量、相同内容的“接收”。尤其是在 LAN 上,您经常会遇到不走运的情况,并且“消息”边界似乎被保留,但不一定如此。

如果你想要消息,你必须发明它们。标准技术:固定长度的消息(听起来像你这样做:长度 1),一个给出长度的标头,分隔符字节。必须对接收器进行编码以重建消息。在线打包无关紧要。


推荐阅读