我想向服务器发送一个整数,递增它并将新数字和随机字符串发送回客户端。我用这个代码
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) 在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) 在java.util.concurrent.FutureTask.run(FutureTask.java:138)at java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:918) 在java.lang.Thread.run(Thread.java:680)
编辑:
它与htonl send an integer from a C client to a Java server一起工作我得到了int但是对于String我有数字而不是字符
答案 0 :(得分:0)
您正在使用htons
函数将int
值转换为网络字节顺序。
函数htons
函数被定义为将little-endian主机上的字节重新排列为网络字节顺序(big-endian),而Java始终是big-endian。
但是此函数转换为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)
答案 1 :(得分:0)
262144是Hex 0x00040000,所以有些东西会改变你的字节顺序。