我怎样才能看到从Java服务器到C++;客户

我怎样才能看到从Java服务器到C++;客户,java,c++,sockets,client-server,Java,C++,Sockets,Client Server,我需要从java服务器发送一个字符串到C++客户端,但是客户端接收到的消息分成块,有时只包含消息的一些部分,我怎么才能看到整个消息? 我不需要发送和接收,因为我接收到消息,但它被分成几个块,在不同的时间到达一些部分,但我需要这些块在一起,而不是分开 这是我的代码: C++客户端: while(1){ if( send(sock , nCartella,(unsigned)strlen(nCartella), 0) < 0){ cout <

我需要从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;
怎么了?请告诉我解决这个问题

  • 准确定义你所说的信息的含义。(可能是“最多1023个不包含换行符和换行符的可打印字符”。或者是对您的应用程序有意义的任何字符。)

  • 按照上面的定义,编写一个接收消息的函数

  • 确保您的“发送”功能发送消息,正如您在上面定义的那样

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

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

    另外,我注意到您忽略了
    recv
    的返回值。因此,您的代码不知道它接收了多少字节。
    append
    怎么可能知道要追加多少字节


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

    while(1){/*…*/break;}的作用是什么?这是两小时前你问的同一个问题的重复@谢尔盖:不,不,不一样。在我需要发送和接收字符串之前,但现在,我接收和发送数据,但字符串没有同时到达客户端,我不知道如何接收客户端发送的整个消息server@SilviaBerardo,有什么区别?你可能会认为这是两个不同的问题,但实际上是关于同一个问题。正如其他人试图解释的,通过TCP发送的不是java和C++对象,而是比特和字节。因此,当您使用TCP时,必须定义您的协议。例如:前8字节(或您选择的任何其他大小)是消息的长度,然后是实际消息的X字节。发送方和接收方都必须实现这个协议。两小时前她已经问过同样的问题了。我不确定她为什么这样做。append并不重要,因为我不使用它,我需要删除它,但是,当我从服务器收到消息时,它的id被划分为不同的块,并且它不完整。。我怎样才能收到全部信息?我找不到任何函数可以use@SilviaBerardo您必须编写函数。读我的答案。
    DataOutputStream os = new DataOutputStream(client.getOutputStream());
                    os.writeBytes(num_cartella+"\n");