无法接受服务器上的套接字连接

Posted

技术标签:

【中文标题】无法接受服务器上的套接字连接【英文标题】:Can not accept socket connections on server 【发布时间】:2019-02-18 20:16:28 【问题描述】:

我创建了一个.NET Console App,我想在其中接受client websockets。(我使用的是chrome扩展-Simple Web Socket Client)。 当我尝试向连接的客户端发送消息时,我在浏览器中收到此错误:

    WebSocket connection to 'ws://localhost:8600/' failed: 
    Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE
    CLOSED: ws://localhost:8600

服务器

class Program
    
        static async Task Main(string[] args)
        
            CancellationTokenSource src = new CancellationTokenSource();

            Console.WriteLine("starting server...");
            Task server = Task.Run(async () =>
            
                Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8600);

                serverSocket.Bind(point);
                Console.WriteLine("Listening on localhost:8600" );
                serverSocket.Listen(6);
                var client = await serverSocket.AcceptAsync();
                Task clientTask = Task.Run(async () =>
                
                    while (true)
                    
                        await client.SendAsync(Encoding.UTF8.GetBytes("Date is" + DateTime.Now.ToString()), SocketFlags.None);
                        await Task.Delay(5000);
                    
                ,src.Token);

            , src.Token);
            while (true)
            
                if (Console.ReadKey().Key == ConsoleKey.A)
                
                    src.Cancel();
                    break;
                
            
        
    

从 Simple Web Socket Client(chrome 扩展)我尝试连接到: ws://localhost:8600

P.S我不确定是否在所有任务中传递相同的令牌,但除此之外我不知道为什么它会出现此错误。

【问题讨论】:

【参考方案1】:

您的服务器代码根本没有实现HTTP 或WebSocket 协议。

WebSocket 会话以HTTP 会话开始,客户端发送HTTP 请求,请求服务器将连接升级到WebSocket protocol,然后服务器的HTTP 响应指示升级是否成功与否,然后才能交换任何 WebSocket 消息。

您的服务器只是打开一个普通的 TCP 端口,然后在客户端连接后立即发送任意字符串数据。您根本没有遵循HTTP 或WebSocket 协议。因此,当然,WebSocket 客户端会报告建立 WebSocket 会话失败。您的服务器没有发回有效的 HTTP 升级响应(正如客户端错误所说)。

不要直接使用Socket 类,而是尝试使用HttpListenerHttpListenerWebSocketContext 类。例如:

How to work with System.Net.WebSockets without ASP.NET?

【讨论】:

以上是关于无法接受服务器上的套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

在 Erlang 中通过 RPC 在远程节点上创建套接字时,无法接受套接字上的连接

postgresql datababse 错误:服务器是不是在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?

UWP C#异步套接字服务器不能接受

在Python中,当在localhost上接受TCP套接字连接时,无法获得正确的对等体IP地址。

Windows 7 上的套接字,无法连接

接受 websocket 使用 tcp .net 很慢?