通过socket将Java客户端写入c服务器

时间:2016-07-02 22:57:33

标签: java c sockets dataoutputstream

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

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。

2 个答案:

答案 0 :(得分:4)

问题在于:

&code + bytesRead

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

答案 1 :(得分:-3)

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

不要跳过文档步骤。这是最重要的一个。准确记录将用于传递信息的字节数。