从C客户端向Java服务器发送字符串时出错

时间:2013-05-04 17:28:27

标签: java c sockets datainputstream

我从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在服务器中

3 个答案:

答案 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);