java - 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);
}
}
解决方案
您可以通过设置套接字选项“TCP_NODELAY”(本地拼写可能会有所不同)来影响发送方的行为,这使得字节更有可能立即发送(受流量控制等影响),但这不会改变TCP。
TCP 不是面向消息的协议,它是一个顺序字节流协议。不能保证单独执行“发送”会在另一端产生相同数量、相同内容的“接收”。尤其是在 LAN 上,您经常会遇到不走运的情况,并且“消息”边界似乎被保留,但不一定如此。
如果你想要消息,你必须发明它们。标准技术:固定长度的消息(听起来像你这样做:长度 1),一个给出长度的标头,分隔符字节。必须对接收器进行编码以重建消息。在线打包无关紧要。
推荐阅读
- c# - 反应式 - 如何组合/加入/查找具有两个序列的项目
- bash - 更新配置中的一行,如果不存在则添加它
- grammar - CFG:为什么这个语法模棱两可?
- python - 当我的训练数据很大时,为什么我会在抛出一个 'std::bad_alloc' 实例后调用终止?
- python - 如何测试我的代码的数值稳定性?
- ruby-on-rails - Ruby on Rails 自引用创建操作返回未知属性错误
- python - 如何使用列表将用户定义的函数更改为熊猫系列
- python - 按出现顺序分配索引
- r - 使用 Rtools 从源安装 R 包失败 - 如何修复 collect2.exe:错误:ld 返回 1 退出状态
- angular - 角度反应形式跨字段自定义验证在编辑中不起作用