我从C客户端向java服务器发送一个整数,它工作得很好。但是当我试图用一个字符串做同样的事情我得到了错误 这是发送String
的客户端代码char clientString[30];
printf("String to send : \n");
if( send( to_server_socket, &clientString, sizeof( clientString ), 0 ) != sizeof( clientString ) )
{
printf( "socket write failed");
exit( -1 );
}
用java代码读取它
DataInputStream din = new DataInputStream(socket.getInputStream());
String clientString=din.readUTF();
System.out.println(clientString);
错误
编辑:我尝试使用java.io.EOFException的 在java.io.DataInputStream.readFully(DataInputStream.java:180)at java.io.DataInputStream.readUTF(DataInputStream.java:592)at java.io.DataInputStream.readUTF(DataInputStream.java:547)at ServiceRequest.run(ServiceRequest.java:43)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)
din.readLine()
,我没有错误但是如果我在客户端输入fffffff12我得到了fffffff12`?7E ^Ê?h在服务器中
答案 0 :(得分:1)
无论输入到底有多长,您都会在clientString
数组中发送所有数据。正确终止字符串,只发送例如<{1}}个字节。
答案 1 :(得分:0)
也许问题是在客户端你正在编写ASCII字符串但在服务器端你正在读UTF,尝试将数据读取为ASCII,如果可能的话请提及发生的异常。此方法可以引发两个异常:1- IO异常或2- EOF异常。
答案 2 :(得分:0)
readUTF
不会从套接字读取字节。它首先读取字符串的长度(作为16位整数),然后读取字符串。问题是您发送的内容不是readUTF
成功运作所需的内容。
正如Joachim Pileborg所指出的,您还发送了整个30个字节的clientString
(包括未明确设置的任何剩余字节)。你应该这样发送它:
send(to_server_socket, clientString, strlen(clientString), 0);