2010-05-22 116 views
0

這裏的人需要一些見解。 我知道協議的定義,是新的這個C++編程是一個相當具有挑戰性的 task.I正在創建使用SDL/C++多線程聊天,這對我來說 一個學習的過程,我現在有遇到一個駝揹我需要克服,但理解它比我想象的要困難一些。我需要製作某種聊天協議,我認爲......但是有一些殘留。直到現在,我一直在用字符串發送消息。現在正在改進應用程序,以便客戶端可以註冊和登錄,我需要一種更好的方式與客戶端和服務器進行通信。瞭解協議

謝謝。

回答

0

創建代表一個消息對象,則序列化對象,其發送通過所述網絡,則反序列化在另一端。

例如,您可以創建一個名爲LoginMessage類,它包含兩個字段。一個用於用戶名,另一個用於密碼。要登錄,您需要執行以下操作:

LoginMessage *msg = new LoginMessage(); 
msg->username = "Fred"; 
msg->password = "you'll never guess"; 

char *serialized_msg = serialize(msg); 

// send the bytes over the network 

您會在另一端做類似的操作,將字節流轉換回對象。

有用於創建消息對象和序列化他們爲你的API。這裏有兩個流行的。兩者都應該適合您的需求。

Protocol Buffers由谷歌
Thrift被Facebook

如果你想序列化的消息是可讀的,你可以使用YAML。 Google有一個名爲yaml-cpp的API,用於將數據序列化爲YAML格式。

UPDATE:

這些API是用來使自己的協議。他們只是處理消息從對象形式到字節流形式的轉換。它們具有通過網絡實際傳輸消息的功能,但不需要使用這些功能。你如何設計你的協議呢?但是如果你想手工創建消息,你也可以這樣做。

我給你一些想法創建自己的消息格式。

這是一種方法。

消息的前4個字節表示消息的長度,作爲無符號整數。這對確定一條消息的結束位置和下一條消息的起始位置很有必要。在讀取和寫入這四個字節時,您需要在主機和網絡字節順序之間進行轉換。

第5個字節代表消息類型。例如,您可以使用1指示登錄請求,使用2指示登錄響應,使用3指示聊天消息。該字節對於解釋剩餘字節的含義是必需的。

其餘字節將包含消息內容。例如,如果它是一個登錄消息,你會以某種方式將用戶名和密碼編碼到這些字節中。如果它是聊天消息,這些字節將包含聊天文本。

+0

謝謝,我希望爲我的聊天應用程序製作自己的小協議。我只是需要一些很好的解釋如何在客戶端和服務器的工作原理之間的通信。例如:客戶端發送一串註冊詳細信息,我如何告訴服務器客戶端要註冊,而不是與其他客戶端聊天......或者讓我的客戶端喜歡「表情符號/」命令或類似的東西 – 2010-05-22 21:03:16

+0

當然,沒問題,看我的更新。 – Jay 2010-05-22 21:28:15

+0

謝謝你,我會盡力讓你遵循你給我的步驟,任何問題,我會回到這裏。 – 2010-05-22 22:20:39