2013-05-03 152 views
0

我想向服务器发送一个整数,将其递增并将新数字和随机字符串发送回客户端。我用这个代码C客户端和Java服务器之间的通信错误

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的在 java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) 在java.io.DataInputStream.readUTF(DataInputStream.java:572)在 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) 在 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但对于字符串,我得到的数字和字符不

+0

您已问过此问题。 http://stackoverflow.com/questions/16362303/send-an-integer-from-ac-client-to-a-java-server – austin 2013-05-03 16:42:33

+0

你在这里发布的代码显示你错过了我之前回答的最终编辑。回去并重新阅读这里的编辑:http://stackoverflow.com/questions/16362303/send-an-integer-from-a-c-client-to-a-java-server/16362518#16362518 – 2013-05-03 16:51:41

回答

0

您正在使用htons功能翻译的int价值为网络字节顺序。

函数htons函数定义为将小端主机上的字节重新排列为网络字节顺序(big-endian),并且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) 
0

262144是十六进制0x00040000,所以东西改变你的字节顺序。

相关问题