2013-03-06 150 views
1

我已經實現了使用Alchemy網絡插座網絡插座服務器,現在想強調測試。我已用C#編寫下面的方法來創建多個客戶端連接到服務器併發送一些數據:但是該服務器接收以下信息(甚至用少量例如100)網絡套接字消息

private void TestWebSocket() 
{ 
    int clients = 10; 
    long messages = 10000; 
    long messagesSent = 0; 
    String host = "127.0.0.1"; 
    String port = "11005"; 

    WSclient[] clientArr = new WSclient[clients]; 
    for (int i = 0; i < clientArr.Length; i++) 
    { 
     clientArr[i] = new WSclient(host, port); 
    } 

    Random random = new Random(); 
    var sw = Stopwatch.StartNew(); 

    for (int i = 0; i < messages; i++) 
    { 
     clientArr[i % clients].Send("Message " + i); 
     messagesSent++; 
    } 
    sw.Stop(); 

    Console.WriteLine("Clients " + clients); 
    Console.WriteLine("Messages to Send" + messages); 
    Console.WriteLine("Messages Sent " + messagesSent); 
    Console.WriteLine("Time " + sw.Elapsed.TotalSeconds); 
    Console.WriteLine("Messages/s: " + messages/sw.Elapsed.TotalSeconds); 
    Console.ReadLine(); 

    for (int i = 0; i < clientArr.Length; i++) 
    { 
     clientArr[i].Disconnect(); 
    } 

    Console.ReadLine(); 
} 

。或有時多個消息被接收作爲單個消息例如:

消息1 = ABC消息2 = DEF

接收爲= ABCDEF

我試圖或多或少複製所示here的例子。目前服務器和客戶端都在本地運行。關於什麼問題或者如何改進測試方法的想法?

回答

0

TCP是流協議,而不是面向消息的協議。這意味着接收器負責發現流中包含的每個消息的開始/結束。這也意味着,接收器不僅負責分崩離析大讀入個人信息,但有時也需要收集讀取,直到收到完整的消息。提供的示例消息顯示發送了兩個消息,並且收到了兩個,但顯然您的服務器無法確定一個消息的結束位置和另一個消息的開始位置。您可能需要在數據中添加某種內部協議以標記每條消息的開頭和結尾。如果你的消息總是完全一樣的長度,你可以只處理大小,但這不太可靠,並且可能難以可靠地連接到其他通信方法(如果在程序生命中稍後需要它 - 幾乎總是發生的事情給我!)

如果你的消息都是一樣的長度,使採摘除了大量閱讀是沒有必要的,接收器可以正常地限制讀取大小(我不知道你的圖書館,雖然)到該長度。然而,讀取由於TCP/IP堆棧可以收集從流數據轉換成用於在物理網絡上傳輸數據包的方式仍可能發生。如果你不想寫集合代碼,那麼你就需要找到一個偷看功能,將告訴你多少數據可供讀取之前實際執行讀取,讓您的程序,等到有在至少一個完整的消息準備閱讀。

+0

的[WebSocket協議](http://datatracker.ietf.org/doc/rfc6455/?include_text=1)是建立在TCP之上的消息協議。它已經包含了必要的框架。 – lnmx 2013-03-06 13:20:06

+0

@lnmx從發送/接收的示例消息看來,該函數並未被使用,所以我的回答可能仍然可以幫助Matt通過提醒他的存在來找到該功能。希望。 – 2013-03-06 13:30:49

+0

這可能是問題,但由於我使用的庫,我不認爲我可以實現解決方案,因此切換庫可能更容易。儘管如此,感謝您的信息+1 – Matt 2013-03-06 14:44:49