1

我已经使用Alchemy Web 套接字实现了一个 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)。或者有时会收到多条消息作为一条消息,例如:

消息 1 = abc 消息 2 = def

接收为 = abcdef

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

4

2 回答 2

1

github 项目中有两个未解决的问题听起来很相似:

其中一位评论者报告说Fleck的运气更好

于 2013-03-06T13:11:26.650 回答
-1

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

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

于 2013-03-06T13:02:01.467 回答