Web Socket消息并非全部被接收

时间:2013-03-06 12:45:20

标签: c# tcp websocket load-testing

我使用Alchemy网络套接字实现了一个Web套接字服务器,现在我正在尝试对其进行压力测试。我在C#中编写了以下方法来创建大量客户端以连接到服务器并发送一些数据:

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();
}

然而,服务器接收的消息较少(即使数量较少,例如100)。或者有时会将多条消息作为单个消息接收,例如:

  

Message1 = abc Message2 = def

     

收到As = abcdef

我试图或多或少地复制显示here的示例。目前服务器和客户端都在本地运行。关于问题是什么或如何改进测试方法的任何想法?

2 个答案:

答案 0 :(得分:1)

github项目有两个未解决的问题:

其中一位评论者报告Fleck

运气好转

答案 1 :(得分:0)

TCP是一种流协议,而不是面向消息的协议。这意味着接收方负责查找流中包含的每条消息的开头/结尾。这也意味着接收方不仅要将大量读取分解为单个消息,而且有时还需要收集读取,直到收到完整的消息。提供的示例消息显示已收到两个消息并且 TWO 已收到,但显然您的服务器无法确定一条消息的结束位置和另一条消息的开始位置。您可能需要在数据中添加某种内部协议,以标记每条消息的开头和结尾。如果你的消息总是完全相同,那么你可以只使用这个大小,但是它不太可靠,并且可能很难可靠地移植到其他通信方法(如果在程序生命的后期需要它 - 这几乎总是发生的事情对我来说!)

如果您的消息长度相同,接收器通常可以将读取大小(我不知道您的库)限制为该长度,这样就不需要分开大读取。但是,由于TCP / IP堆栈可能将数据从流中收集到数据包中以便在物理网络上传输,因此仍可能发生读取。如果您不想编写集合代码,那么您需要找到一个 peek 函数,该函数将告诉您在实际执行读取之前有多少数据可用于读取 ,允许你的程序等到至少足以让一整条消息准备好阅读。