1

現在、Java と c の間でソケット経由で文字列を送信しようとしています。サーバー(Java)からクライアント(c)に文字列を送信することも、その逆も可能ですが、両方を送信することはできません。これが、2つの間で通信する必要がある方法です。私の c (クライアント) コードでは、読み取り部分を挿入するとすぐにコードが停止します。

コードの 2 つの部分を次に示します。ソケット間の接続が成功したと想定しても安全です。

ジャバ:

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++ サーバーがclientKEYメッセージを Java クライアントに送信しているように思えます。\nJava クライアントは行を読み取ります。つまり、C/C++ サーバーから文字を受け取るまで待機します。ただし、C/C++ サーバーによって送信されることはないため、Java クライアントは待機します... 永遠に。

于 2013-11-07T18:24:33.023 に答える
2

C send コードを変更します。

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

clientKey に変数を使用してから strlen を呼び出すと、手動で char をカウントする必要がなくなります。Jiri が指摘したように、Java の readLine 関数は、おそらく取得できない改行文字を予期しているため、ハングします。

于 2013-11-07T18:36:58.880 に答える