2013-03-06 185 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