2016-11-24 104 views
0

我想創建一個聊天應用程序。客戶端將使用java編寫,並且服務器將使用C編寫。在服務器端,消息將作爲struct發送。在客戶端,我如何使用Java讀取和分離消息?Java中的TCP客戶端和C中的服務器

下面是一個示例分組結構:

struct s_packet{ 
int text_color; 
char text[TEXTSIZE]; 
char alias[ALIASIZE]; 
}; 

下面是一個示例服務器(在C)發送功能:

send(iter->client.sockfd, (void *)se_packet, sizeof(s_packet), 0); 

以下是在一個樣本客戶機recv函數C:

recv(m_sockfd, (void *)&se_packet, sizeof(s_packet),0); 

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text); 

我可以讀取s_packet並在C中分開,但是如何在java中執行它?

我怎麼能分開一樣,在Java中:

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text); 
+0

檢查[Java Native Interface](https://en.wikipedia.org/wiki/Java_Native_Interface)! –

+0

不要使用結構作爲網絡協議。使用網絡協議作爲網絡協議。你從錯誤的地方開始。 – EJP

回答

1

的肯定的答案是,它不會那麼容易。你應該瞭解的第一件事是tcp如何工作。 這是一個面向流的協議,並沒有tcp中的「消息」的東西。您只需發送和接收字節流。

在您的代碼段recv可以在讀取服務器發送的部分消息後完成。相反,你應該在java中保留一個本地緩衝區,並放棄迄今爲止收到的所有數據。在while循環中,您可以檢測是否收到了準備處理的消息。如果你的消息不是很大(小於MTU),那麼你可能會很幸運,並總是收到整個'消息'。如果你不關心那個,那麼你可以使用java.io.InputStream.read(byte[])方法。

要考慮的另一件事是你如何解釋你收到的消息。 那麼你沒有其他選擇,只能在Java中將其作爲byte []處理。首先您可能想要閱讀s_packet.text_color。它可能會被放置在消息中的前4個字節。您可以從thoes字節構造int(例如,參見Convert 4 bytes to int)。 但這不是一個好的做法。這是因爲您發送的二進制數據取決於您的s_packetrepresented in memory。在現實生活中,你通常不知道int或char的大小,它取決於平臺。或者有時int內部的字節順序可能不同。相反,您應該聲明自己的系列化協議以及您的郵件如何轉換爲二進制數據,反之亦然。 希望它有幫助。

+0

您有很多關於如何使用Java接收消息的選擇。關於MTU和丟棄數據的部分是不可理解的。 – EJP