【问题标题】:Java - Socket needs delay to receive correct data?Java - 套接字需要延迟才能接收正确的数据?
【发布时间】:2016-03-30 03:37:41
【问题描述】:

我正在编写一个使用套接字从 C 程序接收数据的 Java 程序。

C 程序 malloc 一个整数数组以适应要放入其中的元素的数量。例如:{111,2,2,2,3,3}(111 只是一个消息头),所以 int[] 大小为 6。(我们在发送完成后释放数组,返回值为 0,即是成功)。我们打印出数组的内容,一切都按预期显示:111,2,2,2,3,3

但是,我们意识到在 Java 中,我们需要在从输入流读取之前添加一个小的延迟,否则我们无法获得正确的值。例如。如果我们不在输入流可用之前放置 Thread.sleep(2000),Java 接收到的值就像 111,0,0,0,3,3 (例如,值 2 丢失)

1) 如果我在 C 中发送 int 数组并要求 Java 通过 int 读取 int 是否会影响 Java?

2) 为什么延迟会使数据准确?我们尝试使用 1000,1500,但只有 2000 给出最稳定的结果

3) 如果在 SomeAction.class 中,我会忙着等待:

while (!pcClient.readMessage());

while (!pcClient.readMessage()) {}

它只执行一次while循环然后就爆发了?而如果我在下面这样做,它会按预期工作:

while (!pcClient.readMessage()) {System.out.print("");}

【问题讨论】:

  • 可以分享C代码吗?
  • 我不擅长C,但我认为sizeof msg_queue是指针的大小,而不是int的大小。不是吗?在这种情况下,它可能是 8 而不是 4
  • @bedrin 当我尝试执行 printf("%d, %d", count, sizeof msg_queue);在 malloc 上方,它显示 6, 4

标签: java arrays sockets


【解决方案1】:

1) 如果我在 C 中发送 int 数组并要求 Java 通过 int 读取 int 是否会影响 Java?

当您要求 Java 通过 int 读取它时,它基本上会等待下一个可用的 4 个字节并从这 4 个字节中构建一个 int

看起来您的 Java 客户端在您的 C 服务器开始写入数据之前就开始读取数据 - 这就是为什么延迟 2 秒可以解决您的问题

您可以简单地删除 if(dataIn.available() > 0) { } 条件 - dataIn.readInt() 将阻塞,直到数据在线上可用

【讨论】:

  • 我也对此表示怀疑,这就是为什么我们在尝试处理接下来的 5 个整数之前将 111 作为标题,但不幸的是它没有按预期工作,因为中间/结束值丢失了以随机方式
  • 我们尝试删除dataIn.available() > 0,得到的结果是这样的: Unknown: 6 Unknown: 0 Unknown: 0 Unknown: 0 Unknown: 2 Unknown: 3跨度>
【解决方案2】:

您分配和发送的长度错误。 msg_queue 是一个指针,它的大小与消息长度无关。 sizeof msg_queue 应始终为 sizeof int。您发送的数据过多,因此接收器不同步。

删除无意义的睡眠和available() 测试。与您的睡眠不同,随后的读取将阻塞正确的时间长度。

您不需要在释放动态消息之前清除它。您甚至不需要动态分配消息,因为它的大小在编译时是已知的。

【讨论】:

  • 您好,我已根据您的建议在我的主帖中更新了我的解决方案,但在没有 500 毫秒睡眠的情况下问题仍然存在。知道 Java 方面发生了什么,还是 C 程序仍然错误?
  • 在您按照我的回答摆脱睡眠和available() 测试之前,我不感兴趣。
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多