2

私は2つのアプリケーションと通信したいと思います.TCPでサーバーにメッセージを送信するCのクライアントと、それを受信して​​確認を送信するJavaのサーバーです。

これがクライアントです(コードはスレッドです):

static void *tcp_client(void *p_data)
{
  if (p_data != NULL)
  {
    char const *message = p_data;

    int sockfd, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(ALARM_PC_IP);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(TCP_PORT);

    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        error("ERROR connecting");
    }

    n = write(sockfd,message,strlen(message));

    if (n < 0) {
        error("ERROR writing to socket");
    }

    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) {
      error("ERROR reading from socket");
    }
    printf("Message from the server : %s\n",buffer);
    close(sockfd);
  }

  return 0;
}

そしてJavaサーバー:

try {
    int port = 9015;
    ServerSocket server=new ServerSocket(port);
    System.out.println("Server binded at "+((server.getInetAddress()).getLocalHost()).getHostAddress()+":"+port);
    System.out.println("Run the Client");

    while (true) {
        Socket socket=server.accept();
        BufferedReader in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(in.readLine());
        PrintStream out=new PrintStream(socket.getOutputStream());
        out.print("Welcome by server\n");
        out.flush();
        out.close();
        in.close();
        System.out.println("finished");
    }
} catch(Exception err) {
    System.err.println("* err"+err);
}

n = read(sockfd,buffer,255); の場合 クライアントは応答を待っており、サーバーの場合、メッセージは決して終了しないため、PrintStream で応答を送信しません。

これらの行を削除すると:

bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0) {
  error("ERROR reading from socket");
}
printf("Message from the server : %s\n",buffer);

サーバーはメッセージが終了したことを認識していますが、クライアントは応答を受信できません。

How solve that ?

Thank you

4

1 に答える 1

3

in.readLine() は、ストリームで NL、CR、または CR+NL を待ちます。クライアントメッセージでそれを送信していることを確認してください。

于 2012-10-15T09:49:54.757 に答える