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

我从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)

2 years ago

readUTF 不只是从套接字读取字节 . 它首先读取字符串的长度(作为16位整数),然后读取字符串 . 问题是您发送的内容不是 readUTF 成功运行所需的内容 .

正如Joachim Pileborg所指出的那样,你也发送了整个30字节的 clientString (包括未明确设置的任何剩余字节) . 你应该这样发送它:

send(to_server_socket, clientString, strlen(clientString), 0);

2 years ago

无论输入到底有多长,您都会发送 clientString 数组中的所有数据 . 正确终止字符串,只发送例如而是 strlen(clientString) 个字节 .

2 years ago

也许问题是在客户端你正在编写ASCII字符串,但在服务器端你正在读取UTF,尝试将数据读取为ASCII,如果可能的话请提及发生的异常 . 此方法可以引发两个异常:1- IO异常或2- EOF异常 .