2012-09-13 54 views
4

雖然我是套接字編程的新手,但在編寫一個簡單的tcp服務器客戶端程序時,我發現基於流的api並不便於使用。.NET中是否有任何基於消息的TCP套接字庫?

我的程序是簡單地簡單:

  1. 客戶端連接到一個服務器
  2. 服務器連續地發送消息到客戶端,在一個不可預料的間隔
  3. 客戶機接收消息和做功根據在消息中包含

然而,使用基於流的API的數據,我必須:

  • 定義消息分隔符/分隔
  • 使用while循環讀取從流
  • 的毗連的所有字節的數據,試圖找到分隔符
  • 如果分隔符存在,分割數據,提取消息

這是一個很多的工作,甚至比我的程序的整個邏輯,所以我想知道ING是有圖書館可以做上面我的東西,這樣的圖書館,我可以這樣的程序:

// Server 
TcpListenerEx server = new TcpListenerEx(); 
TcpClientEx client = server.Accept(); 
client.SendMessage(new StringMessage("hello world")); 

// Client 
TcpClientEx client = new TcpClientEx(); 
client.Connect("localhost", 8989); 
while (true) { 
    IMessage message = client.ReadMesage(); 
    // Do work acording to message 
} 

任何建議將受到歡迎,感謝。

+2

WCF可能適合該法案? –

+0

WCF雙模式是一個不錯的選擇,但它有點太「胖」,我不確定最終的部署環境可能有.NET 3.5框架。 – otakustay

回答

2

在字節流中嵌入分隔符並不像看起來那麼容易。您必須處理意外包含分隔符的消息。這導致了很多令人討厭的檢測和轉義代碼。

消息框架的一個非常簡單的方法是預先添加長度前綴。在發送者上,你將消息序列化成一個緩衝區,然後寫入長度,然後寫入緩衝區。接收器首先讀取4個字節以獲取長度。然後它讀取身體。

這不是內置於.NET中,可能是因爲每個二進制協議都略有不同。

所有這些都非常簡單,以至於不太可能找到一個庫。這樣的協議可以寫成幾十行。我的建議是自己做。

如果你想構建你的消息,雖然,有一個偉大的圖書館:protobuf-net(用於.NET谷歌協議緩衝區)。它爲你提供了消息框架,並且以非常理性的方式進行了序列化。它很好地支持協議版本。

+0

感謝所有的迴應,MSMQ,WCF,Thrift和SignalR都是優秀的解決方案,但我認爲MSMQ是一個更好的解決方案,但是在這個問題之後,我們調整了我們的設計,現在我必須編寫一個基於nodejs的服務器和一個基於.NET的服務器客戶端,用一個基於javascript(瀏覽器書籤)的**主客戶端**,所以最好的解決方案似乎是寫我自己的「協議」,因爲每個語言/框架都不能共享同一個庫,這要歸功於長度指定的消息非常適合我的項目:) – otakustay

3

另一種選擇是MSMQ,它是一個消息隊列(而不是TCP/IP流),處理消息而不是字節流。 MSMQ本身可以使用各種傳輸,包括TCP/IP或WCF等。

如果您只是處理Windows(並且自從您提到.NET以來,這不是無理的限制),它可以在Windows的所有版本2000年。

這裏有一些很好的示例代碼,向您展示了使用它的基本方式,以及一些更高級的東西。發送者基本上建立了一條消息並將其排隊,這很簡單。聽衆收到完整的消息。

它不能簡單得多,而且如果你想在Windows上進行消息傳遞,這是讓它快速發展的最簡單方法之一。

0

現在你可能要考慮使用WebSockets。

儘管名稱實際上是一個更一般的協議。它基本上是面向消息的。儘管消息可能會被拆分爲多個框架,但仍有許多庫將重新組合這些框架,以便您可以收到完整的消息。

由於這些庫,您可以使用WebSockets而不是平臺獨立。 Node,.Net,純瀏覽器的javascript - 沒問題。

相關問題