asp.net javascript angularjs 上的慢速 C# websockets

Posted

技术标签:

【中文标题】asp.net javascript angularjs 上的慢速 C# websockets【英文标题】:Slow C# websockets on asp.net javascript angularjs 【发布时间】:2015-09-16 10:38:41 【问题描述】:

这是我的第一个问题。 我正在尝试构建一个可以处理 50-100 个并发用户并每秒发送 50 条消息的 websocket 服务器。 在我的开发机器上,它适用于一个用户,但是当上传到服务器上时,它会越来越慢,具体取决于用户。 感谢您的宝贵时间。

superwebsocket 代码示例:

public class SuperWs

    WebSocketServer server;
    WebSocketSession[] array = new WebSocketSession[100];
    public SuperWs()
    
        server = new WebSocketServer();
        server.Setup(new ServerConfig
        
            Port = 23023,
            Name = "super web socket",
            LogAllSocketException = true,
            LogBasicSessionActivity = true,
        );
        server.NewSessionConnected += NewSessionConnected;
        server.NewMessageReceived += NewMessageReceived;
        server.SessionClosed += SessionClosed;
        server.Start();

        Task.Run(() =>
        
            while (true)
            
                Thread.Sleep(1000);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int i = 0; i < 50; i++)
                
                    for (int j = 0; j < array.Length; j++)
                    
                        if (array[j] != null)
                            array[j].Send(string.Format("Hello! ms: 0, mes: 1", sw.ElapsedMilliseconds, i));
                    
                
                sw.Stop();
            
        );
    

    private void SessionClosed(WebSocketSession session, CloseReason value)
    
        Console.WriteLine("0 1", session.SessionID, value);
    

    void NewMessageReceived(WebSocketSession session, string value)
    
        Console.WriteLine("0 1", session.SessionID, value);
    

    private int count;
    private void NewSessionConnected(WebSocketSession session)
    
        Console.WriteLine(session);
        array[count++] = session;
    

【问题讨论】:

您托管此应用程序的服务器的配置是什么,如果您可以发布您的代码,这将有助于了解您的连接方式?? 【参考方案1】:

首先,当客户端和服务器不在同一台机器上时(例如在您的 DEV 环境中),网络会导致一些延迟。如果您连接了“n”个客户端,则需要“n * 延迟”才能将消息发送到所有节点。您应该为每个会话创建一个不同的循环,因此基本上在 NewSessionConnected 上创建一个每秒发送 50 条消息并在会话断开时结束的新循环(而不是 while(true))。

如果你打算进行并行工作,你应该使用async编程并使用await Task.Delay(1000)而不是Thread.Sleep(1000),因为最新的会阻塞线程,而前一个会允许线程去执行与此同时,还有其他事情。遗憾的是 SuperWebSocket 不支持async 编程。

伪代码:

private async void NewSessionConnected(WebSocketSession session)

    while (session.IsConnected)
    
        await Task.Delay(1000 / 50);
        session.Send("Hello");
    

另外,你必须开始思考当节点断开连接时你会做什么:)

作为旁注,我开发了一个WebSocket framework that supports async programming,即流量should be no problem。

【讨论】:

以上是关于asp.net javascript angularjs 上的慢速 C# websockets的主要内容,如果未能解决你的问题,请参考以下文章

asp.net调用javascript返回值

ASP.NET 服务器端 Javascript

ASP.NET 页面加载完成后运行 javascript 函数

ASP.NET 用户控件中的 Javascript 函数

ASP.NET MVC 验证:导致 javascript 属性?

确定页面在 JavaScript 中是不是有效 - ASP.NET