1

我目前正在尝试通过 Java 和 c 之间的套接字发送字符串。我可以从服务器(java)向客户端(c)发送一个字符串,反之亦然,但两者都不能,这就是我需要在两者之间进行通信的方式。在我的 c(客户端)代码中,只要我插入读取部分,代码就会拖拽。

这是我的两部分代码。可以安全地假设套接字之间的连接是成功的。

爪哇:

private void handshake(Socket s) throws IOException{
    this.out = new PrintStream(s.getOutputStream(), true);
    this.in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String key = in.readLine(); //get key from client
    if(!key.equals(CLIENTKEY)){
        System.out.println("Received incorrect client key: " + key);
        return;
    }

    System.out.println("received: " + key);
    System.out.println("sending key");
    out.println("serverKEY"); //send key to client
    System.out.println("sent");
}

C:

    int n;
    n = write(sockfd,"clientKEY",9);
    if (n < 0)
    {
      perror("ERROR writing to socket");
      exit(1);
    }
  n = read( sockfd,recvBuff,255 );
  if (n < 0)
    {
      perror("ERROR reading from socket");
      exit(1);
    }
  printf("Here is the message: %s\n",recvBuff);
4

2 回答 2

2

在我看来,C/C++ 服务器向clientKEYJava 客户端发送了一条消息。Java 客户端读取一行,即等待它\n从 C/C++ 服务器接收到字符。但是,它永远不会由 C/C++ 服务器发送,因此 Java 客户端会等待……永远。

于 2013-11-07T18:24:33.023 回答
2

修改你的 C 发送代码:

char clientKey[] = "clientKEY\n"
n = write(sockfd,clientKey, strlen(clientKey));

最好为 clientKey 使用一个变量,然后调用 strlen,这样您就不必手动计算 char。正如 Jiri 指出的那样,Java 的 readLine 函数可能期待一个它永远不会得到的换行符,所以它挂起。

于 2013-11-07T18:36:58.880 回答