【问题标题】:write int from Java client to c server over socket通过套接字将 int 从 Java 客户端写入 c 服务器
【发布时间】:2016-07-02 22:57:33
【问题描述】:

我认为这可能是字节排序,但看起来不像。 我不确定它还能是什么。

Linux 上的 Java 客户端

private static final int CODE = 0;
Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.writeInt(CODE);

c 服务器也在 linux 上

int sd = createSocket();
int code = -1;
int bytesRead = 0;
int result;

while (bytesRead < sizeof(int))
{
    result = read(sd, &code + bytesRead, sizeof(int) - bytesRead);
    bytesRead += result;
}

int ntolCode = ntohl(code); //test for byte order issue

printf("\n%i\n%i\n%i\n", code, ntolCode, bytesRead);

打印出来的:

-256
16777215
4

不知道还能尝试什么。

解决方案

这个解决方案对我来说至少不直观,但无论如何感谢反对票!

Java 端

Socket socket = new Socket("10.10.10.10", 50505);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
int x = 123456;
ByteBuffer buff = ByteBuffer.allocate(4);
byte[] b = buff.order(ByteOrder.LITTLE_ENDIAN).putInt(x).array();
out.write(b);

C端

int sd = createSocket();

char buff[4];
int bytesRead = 0;
int result;
while (bytesRead < 4){
    result = read(sd, buff + bytesRead, sizeof(buff) - bytesRead);
    if (result < 1) {
        return -1;
    }
    bytesRead += result;
}

int answer = (buff[3] << 24 | buff[2] << 16 | buff[1] << 8 | buff[0]);

如果有人有任何东西,我仍然对更简单的解决方案感兴趣,如果可能的话,最好使用 BufferedWriter。

【问题讨论】:

  • 刚试过,同样的输出
  • 您的代码没有检查result = -1 可以由read() 返回。
  • 是的,我想我会为这个问题省略一些错误检查。
  • 您不能将BufferedWriter 用于二进制数据,并且您编辑的代码根本不会推进缓冲区指针。
  • 天哪,我很高兴你明白了。

标签: java c sockets dataoutputstream


【解决方案1】:

问题出在这里:

&code + bytesRead

这将以 4 (sizeof code) 的步长增加 code 的地址,而不是 1。您需要一个字节数组或一些类型转换。

【讨论】:

  • 很好的观察,但如果read() 在第一次调用时没有读取所有 4 个字节,这似乎不太可能。不过,我同意先读取字节数组更好。
  • 无论出于何种原因,它在一次读取调用中经常读取不到 4 个字节。谢谢,我试试看。
【解决方案2】:

您忘记设计和实现协议!您编写了一段代码以一种格式发送数据,另一段代码以完全不同的格式接收数据。确定格式,记录该格式,然后编写以该格式发送的代码,然后编写以该格式接收的代码。

不要跳过文档步骤。那是最重要的一个。准确记录将使用哪些字节来传达信息。

【讨论】:

  • 你认为他们为什么使用“完全不同的格式”?
  • 他正在以网络字节顺序发送一个四字节整数。您不能声称这不是协议。
  • @EJP 不管他在发送,他以某种方式发送它。但如果他没有记录下来,就无法说他是否应该这样发送。碰巧以某种特定的方式做某事不是协议。协议是关于事情应该如何发生的规范。
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 2018-06-30
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多