2016-02-29 17 views
-1

我需要從一個java服務器發送一個字符串到一個C++客戶端,但客戶端收到消息分成塊或有時只是消息的某些部分,我怎樣才能看到整個消息? 我不需要發送和接收,因爲我收到消息,但是它被跳入塊,它在不同的時間到達某些部分,但我需要這些塊在一起,而不是分開。如何查看從服務器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

'while(1){/*...*/ break;}'的目的是什麼? – user463035818

+0

這是你兩個小時前問的同一個問題的重複! – SergeyA

+0

@SergeyA不,不一樣。在我需要發送和接收字符串之前,我現在收到併發送數據,但字符串沒有同時到達客戶端,我不知道如何接收服務器發送的全部消息。 –

回答

3
  1. 準確定義消息的含義。 (也許這是「多達1,023個可打印的字符,不包含換行符後跟一個換行符」或者任何對您的應用程序有意義的字符)。

  2. 編寫一個接收消息的函數,就像您在上面定義的那樣。

  3. 確保您的「發送」功能發送消息,正如您在上面定義的那樣。

recv函數剛收到一堆字節。它不知道你的協議認爲是什麼信息或如何接收信息。當您使用TCP並且您需要應用程序級消息時,您必須編寫代碼來發送和接收應用程序級消息。你沒有那樣做。

當您使用TCP來實現一些應用程序級協議時,您必須實際定義和實現該協議。由於您需要發送和接收消息,並且TCP不是消息協議,因此您需要在TCP之上實現消息協議。這意味着您必須同時選擇協議的內容,並編寫實現該選項的發送和接收函數。

此外,我注意到你忽略了recv的返回值。所以你的代碼不知道它接收了多少字節。 append怎麼可能知道要添加多少個字節?

同樣,你可以在緩衝區上調用strcspn。但strcspn只適用於C風格的字符串。如果你想把消息作爲C風格的字符串返回,你必須編寫代碼來做到這一點。 recv函數只是返回原始字節塊,而不是C風格的字符串。

+0

兩小時前她已經問過同樣的問題。我不確定她爲什麼這樣做。 – SergeyA

+0

附加並不重要,因爲我不使用它,我需要刪除它,但是,當我從服務器收到消息時,它將ID分成不同的塊,並且它不完整。如何接收整個消息?我沒有找到任何功能 –

+0

@SilviaBerardo你必須編寫的功能。閱讀我的答案。 –

相關問題