我将一个整数从C客户机发送到java服务器,它工作得很好。但是当我试图用字符串做同样的事情时,我得到了错误这是发送字符串
的客户端代码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:180java.io.DataInputStream.readUTF (DataInputStream.java: 592)java.io.DataInputStream.readUTF (DataInputStream.java: 547)ServiceRequest.run (ServiceRequest.java: 43)java.util.concurrent.Executors RunnableAdapter.call美元(Executors.java: 439)java.util.concurrent.FutureTask Sync.innerRun美元(FutureTask.java: 303)在java.util.concurrent. futurettask .run(futurettask .java:138) atjava.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
发送clientString
数组中的所有数据,无论输入的实际长度如何。正确终止字符串,只发送例如strlen(clientString)
字节。
readUTF
不只是从套接字读取字节。它首先读取字符串的长度(作为一个16位整数),然后读取字符串。问题是,您发送的内容不是readUTF
成功工作所需的内容。
正如Joachim Pileborg所指出的,您还发送了clientString
的整个30字节(包括未显式设置的任何剩余字节)。你应该这样发送:
send(to_server_socket, clientString, strlen(clientString), 0);
也许问题是,在客户端,你正在写ASCII字符串,但在服务器端,你正在读取UTF,尝试读取数据作为ASCII,以及如果可能的话,请提及发生的异常。该方法可以引发两个异常:1- IO异常或2- EOF异常。