接受 websocket 使用 tcp .net 很慢?

Posted

技术标签:

【中文标题】接受 websocket 使用 tcp .net 很慢?【英文标题】:Accept websocket use tcp .net very slow? 【发布时间】:2014-04-15 07:22:15 【问题描述】:

我使用 websocket 服务器创建了一个 .NET 类套接字。当我的浏览器尝试连接到我的程序上的套接字时,我看到在我的浏览器连接后调用方法“接受套接字”的速度非常慢或几秒钟。我尝试创建许多连接,但套接字每秒接受一个 websocket。我也试过alchemy websocket,结果和我的代码一样。

我在IIS8上使用过Miscrosoft websocket后,发现速度还不错。

我不是实验性的。

我的代码(快递)

class Connection

    byte[] buffer = new byte[1024];
    Socket socket;
    bool IsAuthencation;
    public Connection(Socket socket)
    
        this.socket = socket;
        socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
    

    void OnReceive(IAsyncResult result)
    
        try
        
            int count = socket.EndReceive(result);
            if (count != 0)
            
                if (!IsAuthencation)
                
                    byte[] tmp = new byte[count];
                    Array.Copy(buffer, 0, tmp, 0, count);
                    string Request = Encoding.UTF8.GetString(tmp);
                    if (Request.Contains("GET"))
                    
                        if (!IsAuthencation)
                        
                            int indexStart = Request.IndexOf("Sec-WebSocket-Key: ");
                            int indexEnd = Request.IndexOf("Sec-WebSocket-Version:");
                            string key = Request.Substring(indexStart + 19, indexEnd - indexStart - 21);
                            string magic = string.Concat(key, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
                            string base64 = "";
                            using (SHA1 sha1 = SHA1.Create())
                            
                                byte[] bufferMagic = sha1.ComputeHash(Encoding.UTF8.GetBytes(magic));
                                base64 = Convert.ToBase64String(bufferMagic);
                            

                            Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
                                + "Connection: Upgrade" + Environment.NewLine
                                + "Upgrade: websocket" + Environment.NewLine
                                + "Sec-WebSocket-Accept: " + base64
                                + Environment.NewLine
                                + Environment.NewLine);
                            socket.BeginSend(response, 0, response.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
                            IsAuthencation = true;
                        
                    
                
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
            
            else
            
                // disconnect
            
        
        catch (Exception)
        

        
    

    void OnSend(IAsyncResult result)
    
        try
        
            socket.EndSend(result);
        
        catch (Exception)
        

        
    


class Program

    static List<Connection> clients;
    static Socket socket;

    static void Main(string[] args)
    
        clients = new List<Connection>();
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 30000);
        socket.Bind(endPoint);
        socket.Listen(0);
        socket.BeginAccept(new AsyncCallback(AcceptAsync), null);
        Console.ReadLine();
    

    static void AcceptAsync(IAsyncResult result)
    
        Console.WriteLine("a new connection");
        Socket s = socket.EndAccept(result);
        clients.Add(new Connection(s));
        socket.BeginAccept(new AsyncCallback(AcceptAsync), null);
    



您可以尝试命令 javascript var socket= new WebSocket("ws://localhost:30000"),我的代码中没有发现问题。 谢谢

【问题讨论】:

【参考方案1】:

您必须接受套接字,并异步处理它,然后立即返回接受更多套接字。

更新

查看您的代码后,您似乎正在异步接受连接。你是如何创建这些测试连接的?如果您创建的太多,您可能会使应用饱和。

我想我看到了问题所在,你为什么将 socket backlog 设置为 0?从 SO 中读取this answer。

尝试设置更大的值:socket.Listen(100);

【讨论】:

我在主题上编辑代码,您可以帮助检查代码中的错误逻辑吗? 我在浏览器chrome上发送命令,你使用chrome,表达f12,点击标签控制台,写命令var socket = new WebSocket("ws://localhost:30000") 虽然我改用 socket.Listen(100),但我发现速度很慢。你的结果测试?

以上是关于接受 websocket 使用 tcp .net 很慢?的主要内容,如果未能解决你的问题,请参考以下文章

2022/1/4TCP和websocket通讯

.NET WebSockets 和 TCP_NODELAY

.NET开发——WebSocket应用

WCF - 在 net.tcp://..../Querier.svc 上没有可以接受消息的端点侦听

浏览器上的 WebSocket 客户端可以与 TCP Socket 服务器通信吗?

在 net.tcp://url 上没有可以接受消息的端点侦听。这通常是由不正确的地址或 SOAP 操作引起的