java - C客户端与Java服务器通信错误

标签 java c sockets

我想向服务器发送一个整数,递增它并将新数字和一个随机字符串发送回客户端。我使用这段代码

int value = htons( 4 );
int reply = 0;
send( to_server_socket, &value, sizeof( value ),0 );
recv( to_server_socket, &reply, sizeof( reply ), 0 );
printf( "got reply: %d\n", ntohs( reply ) );

服务器代码

DataInputStream din = new DataInputStream(socket.getInputStream());
        int ClientNumber= din.readInt();
        System.out.println(ClientNumber);


        ClientNumber++;
       DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
       dos.writeInt(ClientNumber);

       String randomString= getRandomValue(10,20);
       dos.writeUTF(randomString);

但是服务器没有收到4而是262144并且客户端中的回复仍然是0。我在服务器中也有错误

java.io.EOFException at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) at java.io.DataInputStream.readUTF(DataInputStream.java:572) at java.io.DataInputStream.readUTF(DataInputStream.java:547) at ServiceRequest.run(ServiceRequest.java:41) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680)

编辑:

它与htonl一起工作send an integer from a C client to a Java server我得到了 int,但对于字符串,我得到了数字而不是字符

最佳答案

您正在使用 htons 函数将 int 值转换为网络字节顺序。

函数 htons 函数被定义为将小端主机上的字节重新排列为网络字节顺序(大端),而 Java 始终是大端。

但是该函数转换 16 位值,而不是 32 位值。以下是一些内容:

4      = 00000100 00000000 00000000 00000000 (2^2) (little-endian)
262144 = 00000000 00000100 00000000 00000000 (2^18) (big-endian)

尝试使用htonl函数,它将 32 位 int 值转换为网络字节顺序。那么结果应该是这样。

4      = 00000100 00000000 00000000 00000000 (2^2) (little-endian)
4      = 00000000 00000000 00000000 00000100 (2^2) (big-endian)

关于java - C客户端与Java服务器通信错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16363462/

相关文章:

java - 我想用相应的键遍历 HashMap 中的键和列表我想要打印值(列表)

java - 将所有月份设置为java中的列表

c - 打印函数变量时打印输出不同

Java 套接字 - 是否需要客户端的显式反馈?

c - 如何使用 libreadline 在套接字上进行选择?

java - 如何从 Java 调用 C++?

java - 如何实现自旋锁以避免阻塞

c - C 中的空白字符计数器

c - 为什么在信号处理程序中使用互斥锁会出现问题?

c++ - boost asio - 缺陷代码的更改