2017-08-01 62 views
0

我有一個將JSON字符串發送到Java客戶端的C++套接字服務器。對於Java部分我用下面的代碼:Java Socket Read在第二次讀取時返回奇怪字符

BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream()));  
while((inString = in.readLine()) != null) { 
      Log.i("JSON", inString); 

C++代碼:

WSADATA wsa; 
SOCKET s, new_socket; 
struct sockaddr_in server, client; 
int c; 

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { return false; } 

if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { return false; } 

server.sin_family = AF_INET; 
server.sin_addr.s_addr = INADDR_ANY; 
server.sin_port = htons(13377); 

if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) { return false; } 

listen(s, 3); 

c = sizeof(struct sockaddr_in); 
new_socket = accept(s, (struct sockaddr *)&client, &c); 
if (new_socket == INVALID_SOCKET) { return false; } 

while (listenSocket) { 
    if(...){ 
     char sendData[] = "hallo"; 
     send(new_socket, sendData, sizeof(sendData), NULL); 
    } 

當接收到第一次一切都按計劃進行接收。但是,第二次它只打印出正方形「 」中的問號。那是因爲我發送了一個2048個字符的char數組,它可能只包含比這個數量更少的數字,或者這個問題會是什麼?

+0

請同時提供您的C++代碼。 https://stackoverflow.com/help/mcve – Tezirg

回答

0

我想你不應該把不必要的數據無論哪種方式,所以在你的情況下,只有與發送字符串以下\0或更好,一般默認方式字節後,如果沒有\0數據和只讀單一長度字符串不是一個完整的行。

例如,當讀取整數作爲數據大小時,請注意字節順序(litte或big endian)。

我確定有更多關於Java如何將字符串編碼爲套接字連接的文檔,或者您必須自己讀取原始字節並將其轉換爲Java字符串。

0

你正在閱讀的線條,通過\n\r,或\r\n終止,爲BufferedReader.readLine()規定即字符數據,但什麼您是送是不是線,是空值終止的C字符串。因此,在發件人關閉連接之前,您將不會收到任何內容,然後您將收到一個字符串,其中包含哪些人知道空位的位置。

您也沒有錯誤檢查send()的結果。

相關問題