在连接时发送 Websocket 参数但不发送查询字符串

Posted

技术标签:

【中文标题】在连接时发送 Websocket 参数但不发送查询字符串【英文标题】:Send Websocket param on connect but not query string 【发布时间】:2018-06-06 14:39:38 【问题描述】:

我正在使用Microsoft.Web.WebSockets,如下所示,我如何在连接时指定正在连接的用户而不在查询字符串中设置他的 ID,我在服务器中有一个属性项,但在客户端我找不到任何东西像这样。

这是我的服务器:

using System.Linq;
using Microsoft.Web.WebSockets;

namespace TestSocket

    public class TestWebSocketHandler : WebSocketHandler
    
        private static WebSocketCollection clients = new WebSocketCollection();
        private string name;
        public override void OnOpen()
        
            this.name = this.WebSocketContext.QueryString["name"];
            var a = this.WebSocketContext.Items["test"];
            var all = clients.Where(n => ((TestWebSocketHandler)n).name == this.name);
            if (all.Count() > 0)
            
                clients.Remove((TestWebSocketHandler)all.ToList()[0]);
            
            clients.Add(this);
        

        public override void OnMessage(string message)
        
            // WebSocketPacket webso = JsonConvert.DeserializeObject<WebSocketPacket>(message);
            //  WebSocketPacket response = new WebSocketPacket();
            var channel = clients.FirstOrDefault(n => ((TestWebSocketHandler)n).name == message);
            if (channel != null)
                channel.Send("test 123");
        

        public override void OnClose()
        
            clients.Remove(this);

        
    

这是我的客户:

var ws = new WebSocket("ws://localhost:30455//ws.ashx");
ws.Connect();
ws.Send("BALUS");

以及如何加密服务器和客户端之间发送的数据?

【问题讨论】:

【参考方案1】:

如何在连接时指定正在连接的用户而不在查询字符串中设置他的 ID

WebSocket 连接握手是使用 HTTP GET 请求执行的。在GET 请求中,只有两种方法可以将自定义数据传递到 HTTP 服务器 - 通过 URL 查询字符串和通过自定义 HTTP 标头。大多数 WebSocket 客户端库不允许您在 WebSocket 握手期间指定自定义 HTTP 标头,因此只留下 URL 查询字符串(如果您正在编写自己的 HTTP 客户端,那么您可以发送任何您想要的 HTTP 标头)。

如何加密服务器和客户端之间发送的数据?

使用wss:// 而不是ws://

【讨论】:

好的交易,我怎样才能以没有任何拥有链接的人可以连接的方式验证连接? @User7291 TLS 和证书对此很有用。 WSS 是基于 TLS 的 WebSocket。或者,由于 WebSocket 握手是通过 HTTP/S 执行的,因此也可以使用 HTTP 身份验证。 你能给我提供一个客户端/服务器的例子吗? 你的意思是在cookie中设置授权?

以上是关于在连接时发送 Websocket 参数但不发送查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

websocket客户端在发送大数据时断开连接

WebSocket 在发送时关闭

使用websocket发送图片文件

Go语言实现建立websocket连接并定时发送心跳

Android 在前台服务中丢失 websocket 连接

c++ websocket帧发送导致服务器关闭连接