C# 未接收到所有Web套接字消息

C# 未接收到所有Web套接字消息,c#,tcp,websocket,load-testing,C#,Tcp,Websocket,Load Testing,我已经使用web套接字实现了一个web套接字服务器,现在正尝试对其进行压力测试。我用C#编写了以下方法来创建多个客户端以连接到服务器并发送一些数据: private void TestWebSocket() { int clients = 10; long messages = 10000; long messagesSent = 0; String host = "127.0.0.1"; String port = "11005"; WScli

我已经使用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();
}
private void TestWebSocket()
{
int=10;
长消息=10000;
长消息sent=0;
字符串host=“127.0.0.1”;
字符串端口=“11005”;
WSclient[]clientArr=新的WSclient[clients];
for(int i=0;i
但是,服务器接收的消息较少(即使是少量消息,例如100)。或者有时多条消息作为一条消息接收,例如:

Message1=abc Message2=def

接收为=abcdef


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

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


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

github项目中有两个类似的开放问题:


其中一位评论者报告说

是一个建立在TCP之上的消息传递协议。它已经包含了必要的框架。@从发送/接收的示例消息来看,lnmx似乎没有使用该功能,因此我的回答可能会提醒Matt该功能的存在,从而帮助Matt找到该功能。希望如此。这可能是一个问题,但是由于我使用的库,我不认为我可以实现一个解决方案,所以切换库可能更容易。不过,感谢您提供的信息+1有关TCP的事实是正确的,但答案与问题不符。这可能会让那些对WebSocket有问题的人感到困惑。好吧,所以这不是我这边的问题,谢谢你的帮助,我将尝试使用另一种WebSocket实现。