簡體   English   中英

簡單的聊天協議

[英]Simple chat protocol

我正在學習 C# 中的網絡和線程。 為此,我正在開發網絡聊天。

目前我在客戶端 - 服務器(TCP)之間進行了基本的通信。 服務器可以與多個客戶端一起工作。 但只有客戶端-服務器通信。 基本上,客戶端將 ASCII 編碼的消息發送到服務器,然后服務器對其進行解碼並在控制台中顯示。

現在我想實現客戶端-客戶端通信。

假設我們有每個客戶端的在線客戶端列表和用於向每個客戶端發送消息的消息框。

下一步是單擊按鈕,它將組成一個 Socket 並發送,然后服務器應該了解誰是尋址消息。

那么,我的消息結構應該是什么,以及在服務器中我應該如何理解,誰發送消息?

通常我不需要代碼,我需要理論。 簡單而簡短。 也許教程?

我研究過XMPP。 它很重。 我只需要方向,我怎么能做到這一點。 我的目標是學習,而不是實施並忘記。

TCP 是基於 stream 的,這意味着在 TCP 的幫助下,您永遠不會知道消息何時開始和結束。 任何消息/協議設計都需要解決這個問題。

有兩種方法可以檢測消息何時結束。 第一種方法是在消息末尾添加分隔符,第二種方法是在 header 中包含長度。

HTTP 兩者都使用。 它使用空行來確定 header 何時結束。 在 header 中,它有一個 Content-Length header ,它告訴我們身體有多大。

對於二進制協議,我建議您使用固定長度 header ,其中第一個 integer (4 字節)是一個版本,第二個 integer 是正文長度。 通過這種方式,您可以輕松地在版本之間切換 header 布局(因為版本是第一個整數)。

對於文本協議,它實際上取決於消息內容的外觀。 問題是內容可能不包含要使用的分隔符(如果您正在傳輸聊天消息,這可能會很困難)。 如果分隔符存在於實際聊天消息中,您當然可以轉義它。 但恕我直言,更好的方法是使用像 HTTP 這樣的標題/正文布局(因為它也很容易解析,您可以擁有 X 個標題而無需更改解析器)。

一條消息如下所示:

From: Arne
To: #ChannelName
WrittenAt: 2011-07-03 12:00 GMT
Content-Length: 16

This is a text

請注意,長度為 16,這是因為新行包含在正文中。

至於客戶端-客戶端通信,如果您是初學者,我將始終通過服務器 go。 這要容易得多,否則您必須確保至少有一個客戶端不在路由器后面(否則將無法傳遞消息)。

如果是聊天室或用戶,只需檢查To header。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM