asp.net javascript angularjs上的慢速C#网络套接字





这是我的第一个问题

我正在尝试构建一个websocket服务器,它可以处理50-100个并发用户,每秒发送50条消息

在我的开发机器上,它只适用于一个用户,但当上传到服务器上时,速度会越来越慢,这取决于用户

谢谢你抽出时间

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

首先,当客户端和服务器不在同一台机器上时(比如在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框架,这样的流量应该没有问题。

相关内容

  • 没有找到相关文章

最新更新