如何查看从服务器Java到C ++客户端的整个消息?

时间:2016-02-29 17:44:10

标签: java c++ sockets client-server

我需要将一个字符串从java服务器发送到c ++客户端,但是客户端收到的消息被分成块或者有时只是消息的某些部分,我怎样才能看到整个消息? 我不需要发送和接收,因为我收到消息但是它被分成块并且它在不同的时间到达某些部分但我需要这些块在一起而不是分开。

这是我的代码:

C ++客户端

    while(1){
        if( send(sock , nCartella,(unsigned)strlen(nCartella), 0) < 0){
            cout <<"Invio fallito"<<endl;
            return 1;
        }
        cout << "Messaggio inviato"<<endl;  

        if (recv(sock, buff, sizeof(buff)-1, 0) < 0)
        {
            cout << "Error receiving message " << endl;
            return 1;
        }
        message.append(buff);           
        break;                      
    }

    int finale=strcspn(buff,"\n");

    for(int a=0;a<finale;a++){
        cout<<buff[a];
    }

    cout << endl;

Java服务器

DataOutputStream os = new DataOutputStream(client.getOutputStream());
                os.writeBytes(num_cartella+"\n");

有什么问题?请麻烦我解决这个问题

1 个答案:

答案 0 :(得分:3)

  1. 准确定义消息的含义。 (也许它是“最多1,023个可打印的字符,不包含换行符后跟换行符。”或者对你的应用程序有意义的任何内容。)

  2. 编写一个接收消息的函数,如上所述。

  3. 确保您的“发送”功能发送消息,如上所述。

  4. recv函数只接收一堆字节。它不知道您的协议认为是什么消息或如何接收消息。当您使用TCP并且需要应用程序级消息时,您必须实际编写代码以发送和接收应用程序级消息。你没有这样做。

    当您使用TCP实现某些应用程序级协议时,您必须实际定义并实现该协议。由于您需要发送和接收消息,并且TCP不是消息协议,因此您需要在TCP之上实现消息协议。这意味着您必须选择协议的内容并编写实现该选择的发送和接收函数。

    另外,我注意到你忽略了recv的返回值。所以你的代码不知道收到了多少字节。 append怎么可能知道要追加多少字节?

    同样,您在缓冲区上调用strcspn。但strcspn仅适用于C风格的字符串。如果要将消息作为C风格的字符串返回,则必须再编写代码来执行此操作。 recv函数只返回原始字节的块,而不是C样式的字符串。