【问题标题】:TCP Client message acumulatingTCP客户端消息累积
【发布时间】:2019-10-02 01:24:44
【问题描述】:

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

应该只有一个字母a,并且从这个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);
}

}

【问题讨论】:

    标签: java networking tcp ip


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2017-01-11
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多