我从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.DataInputStream.readFF上的java.io.DataInputStream.readFF(DataInputStream.java:592)java.io.DataInputStream.readFF上的java.io.EOFException(DataInputStream.java:180) )at java.util.concurrent.Executors的ServiceRequest.run(ServiceRequest.java:43)java.util.concurrent.FutureTask的$ RunnableAdapter.call(Executors.java:439)$ Sync.innerRun(FutureTask.java:303) at java.util.concurrent.TutureTask.run(FutureTask.java:138)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor) .java:918)在java.lang.Thread.run(Thread.java:680)
编辑:我尝试使用 din.readLine()
,我没有错误,但如果我在客户端键入fffffff12我得到fffffff12`?7E ^Ê?h在服务器中
3 回答
readUTF
不只是从套接字读取字节 . 它首先读取字符串的长度(作为16位整数),然后读取字符串 . 问题是您发送的内容不是readUTF
成功运行所需的内容 .正如Joachim Pileborg所指出的那样,你也发送了整个30字节的
clientString
(包括未明确设置的任何剩余字节) . 你应该这样发送它:无论输入到底有多长,您都会发送
clientString
数组中的所有数据 . 正确终止字符串,只发送例如而是strlen(clientString)
个字节 .也许问题是在客户端你正在编写ASCII字符串,但在服务器端你正在读取UTF,尝试将数据读取为ASCII,如果可能的话请提及发生的异常 . 此方法可以引发两个异常:1- IO异常或2- EOF异常 .