C# Websocket连接实现wss协议

目录
  • 一、什么是Websocket?
  • 二、Websocket、Socket、Http、Mqtt之间的区别?
    • Socket:
    • WebSocket:
    • MQTT:
    • HTTP:
  • 三、WS和WSS协议

一、什么是Websocket?

1.WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
2.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
3.Websocket是一个持久化的协议

二、Websocket、Socket、Http、Mqtt之间的区别?

Socket:

Socket是对tcp/ip协议族的封装的接口,Socket连接可以指定不同的传输层协议,即TCP或UDP,由于它是基于tcp/ip的,所以一般用在局域网内通信。

WebSocket:

WebSocket协议是基于TCP的一种新的网络协议,和http协议一样属于应用层协议,是一种让客户端和服务器之间能进行双向实时通信(全双工)的技术,且支持长连接,可以进行互联网间通信。引入ws和wss分别代表明文和密文的websocket协议,且默认端口使用80或443,几乎与http一致,WebSocket也要有一个握手过程,然后才能正式收发数据,由于数据包头部协议较小,不同于http每次请求需要携带完整的头部,所以网络开销比较少,长连接也让延迟明显更少(不需要重复新建连接)。

MQTT:

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
1.使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2.对负载内容屏蔽的消息传输;
3.使用 TCP/IP 提供网络连接;

HTTP:

HTTP是一个属于应用层的,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

通信方式:

1.浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
2.HTTP之请求消息Request:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
3.HTTP之响应消息Response:HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
若connection 模式为close,则服务器会主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

三、WS和WSS协议

WS协议和WSS协议两个均是WebSocket协议的SCHEM,两者一个是非安全的,一个是安全的。也是统一的资源标志符。就好比HTTP协议和HTTPS协议的差别。非安全的没有证书,安全的需要SSL证书。(SSL是Netscape所研发,用来保障网络中数据传输的安全性,主要是运用数据加密的技术,能够避免数据在传输过程被不被窃取或者监听。)其中WSS表示在TLS之上的WebSocket。WS一般默认是80端口,而WSS默认是443端口,大多数网站用的就是80和433端口。(在高防防护过程中,80和433端口的网站是需要备案才可以接入国内的。)当然网站也会有别的端口,这种如果做高防是方案是可以用海外高防的。WS和WSS的体现形式分别是TCP+WS AS WS ,TCP+TLS+WS AS WS。服务器网址就是 URL。最后墨者安全再说下WebSocket协议的特点:建立在 TCP 协议之上,服务端实现容易;与 HTTP 协议有良好的兼容性,握手时不容易被屏蔽,可以通过各种 HTTP 代理服务器;数据轻量,实时通讯;可以发送文本和二进制数据。不限制同源,客户端可以与任意服务器端进行通讯。因此WebSocket协议的出现,为很多人解决了关于扩展以及兼容性协议的烦恼问题。

WSS连接:由于wss是基于SSL,所以需要进行双向验证,客户端连接服务端时,我需要添加证书(服务端不验证可以不添加),服务端进行验证。注意:客户也需要对服务端进行验证,所以需要添加服务端证书回调,进行验证,这是很多人忽视,所以出现无法连接远程服务器,TLS/SSL验证失败的提示。

        public MainWindow()
        {
            InitializeComponent();
            RemoteCertificateValidationCallback remote = ValidateServerCertificate;
            ServicePointManager.ServerCertificateValidationCallback = remote;
        }
        /// <summary>
        /// 服务端验证
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        public bool ValidateServerCertificate( object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
        {
            return   true ;
        }
        /// <summary>
        /// WebSocket客户端连接
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public async Task Connect()
        {
            CancellationTokenSource t = new CancellationTokenSource();
            try
            {
                client.Options.SetRequestHeader("key", "value");
                X509Certificate2 cert = new X509Certificate2("xxx.cert");
                client.Options.ClientCertificates.Add(cert);
                Uri uri = new Uri("wss://xxxxxx");
                //var config=new ServerConfig
                await client.ConnectAsync(uri, t.Token);
                Thread.Sleep(300);
                Console.WriteLine($"链接websocket:[{uri}] 完成");
                Task s1 = new Task(Receive, t, t.Token, TaskCreationOptions.LongRunning);
                s1.Start();
                token = t;
                Console.WriteLine("Send Hello");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"链接websocket:[{uri}] 失败", ex.Message);

            }
        }
        /// <summary>
        /// Websocket接收
        /// </summary>
        /// <param name="obj"></param>
        private void Receive(object obj)
        {
            CancellationTokenSource ts = obj as CancellationTokenSource;
            byte[] bs = new byte[1024];
            while (!ts.Token.IsCancellationRequested)
            {
                try
                {
                    ArraySegment<byte> buff = new ArraySegment<byte>(bs, 0, bs.Length);
                    Task<WebSocketReceiveResult> res = client.ReceiveAsync(buff, ts.Token);
                    res.Wait();
                    if (ts.Token.IsCancellationRequested)
                    {
                        return;
                    }
                    if (WebSocketCloseStatus.NormalClosure == res.Result.CloseStatus)
                    {
                        Console.WriteLine($"websocket:与服务器断开链接:{res.Result.CloseStatus} --> Desc :{res.Result.CloseStatusDescription}");
                        ts.Cancel();
                        return;
                    }
                    string strData = encod.GetString(bs, 0, res.Result.Count);
                    Console.WriteLine(strData);
                    WsMsg msg = WsMsg.Deserialize(strData);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("解析或执行 websocket:命令失败", ex);
                }
            }
        }

Websocket客户端与服务端通信代码参考文章:

WebSocket协议:5分钟从入门到精通 - 程序猿小卡  https://www.cnblogs.com/chyingp/p/websocket-deep-in.html

C# WebSocket_熊思雨的博客 https://blog.csdn.net/qq_38693757/article/details/114933642

C# WebSocket - 南国叶子 https://www.cnblogs.com/nanguoyezi/p/9351555.html

到此这篇关于C# Websocket连接实现wss协议的文章就介绍到这了,更多相关C# Websocket连接wss内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# websocket及时通信协议的实现方法示例

    传统"长轮询"实现Web端即时通讯的问题 WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器.这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽. 而比较

  • C# 实现WebSocket服务端教程

    .net4.5中实现了对websocket的支持 在这里我使用的是.net4.0.因此需要对原本的socket发送的数据根据websocket的协议进行解析和打包. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Threading; using System.Net; namespace We

  • C#用websocket实现简易聊天功能(服务端)

    C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4 功能包含群聊,和私聊 界面 界面设计代码 namespace chat_server {     partial class Form1     {         /// <summary>         /// 必需的设计器变量.         /// </summary>         private System.Compo

  • C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的相关概念问题,在这里就不再做具体的介绍了,有兴趣的可以自行百度. 下面我们介绍一款WebSocket组件websocket-sharp的相关内容. 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端,websocket-sha

  • C#基于WebSocket实现聊天室功能

    本文实例为大家分享了C#基于WebSocket实现聊天室功能的具体代码,供大家参考,具体内容如下 前面两篇温习了,C# Socket内容 本章根据Socket异步聊天室修改成WebSocket聊天室 WebSocket特别的地方是 握手和消息内容的编码.解码(添加了ServerHelper协助处理) ServerHelper: using System; using System.Collections; using System.Text; using System.Security.Cryp

  • C#用websocket实现简易聊天功能(客户端)

    本文实例为大家分享了C#用websocket实现简易聊天功能的具体代码,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,和私聊参考C# 利用websocket实现简易聊天功能——服务端 界面 界面设计代码 namespace chat_client {     partial class Form1     {         /// <summary>         /// 必需的设计器变量.         /// </summ

  • C#使用WebSocket实现聊天室功能

    WebSocket介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据. 当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发

  • C# Websocket连接实现wss协议

    目录 一.什么是Websocket? 二.Websocket.Socket.Http.Mqtt之间的区别? Socket: WebSocket: MQTT: HTTP: 三.WS和WSS协议 一.什么是Websocket? 1.WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)2.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的3.Websocket是一个持久化的协议 二.Websocket.Socket.Http

  • HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天

    1.什么是WebSocket? WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSocket over TLS(TransportLayer Security,传输层安全性,原称"SSL"))的单一请求,并且重用从客户端到服务器以及服务器到客户端的同一连接.WebSocket 减少了延迟,因为一旦建立起WebSocket 连接,服务器可以在消息可用时发送它们.例如,和轮

  • 在koa中简单使用Websocket连接的方法示例

    目录 前言 ws模块安装 websocket初始化 websocket下发数据 总结 前言 在一次项目需求会上,有个新需求是要让用户从管理后台主动下发数据到app前端,从而让前端那边对这主动下发的数据做一些用户交互.实现思路很清晰,用Websocket的方式.Websocket 是一种自然的全双工.双向.单套接字连接,是建立在 TCP 协议上的. 相比于 HTTP 协议,Websocket 链接一旦建立,即可进行双向的实时通信: ws模块安装 由于后台是基于node+koa2+mongo进行开发

  • nginx配置wss协议的实现

    需求:nginx配置websocket协议连接,(背景,在一个使用一个免费的仅仅支持单域名的证书时,既要支持https协议,也要支持wss协议时,我们可以配置一个nginx根据不同的路径去跳转) 我所使用的是华为云的免费领取的一年的证书(因为仅仅支持单域名所以才要根据域名后的路径做不同的跳转) 项目的接口在内部为127.0.0.1:8888/request/play也就是本地通过 ws://localhost:28888 进行socket连接,当然因为使用域名wss,所以此处需要放到服务器 ws

  • Go 实现百万WebSocket连接的方法示例

    大家好!我是 Sergey Kamardin,是 Mail.Ru 的一名工程师. 本文主要介绍如何使用 Go 开发高负载的 WebSocket 服务. 如果你熟悉 WebSockets,但对 Go 了解不多,仍希望你对这篇文章的想法和性能优化方面感兴趣. 1. 简介 为了定义本文的讨论范围,有必要说明我们为什么需要这个服务. Mail.Ru 有很多有状态系统.用户的电子邮件存储就是其中之一.我们有几种方法可以跟踪该系统的状态变化以及系统事件,主要是通过定期系统轮询或者状态变化时的系统通知来实现.

  • vue项目使用websocket连接问题及解决

    目录 vue使用websocket连接 前景 解决过程 vue2全局使用websocket记录 新建ws模块文件 在main.js中引用ws模块文件 App.vue挂载时再次连接服务器并且接收消息 vue使用websocket连接 前景 公司做一个包含websocket的项目,我用的是vue做的,开始只有一个组件的要求demo,就将websocket的配置直接放在组件方法中,组件挂载时直接初始化ws,但是后续组件增加,开始出现多个websocket链接的情况,是不允许的. 刚开始的做法是将web

  • Django+Vue实现WebSocket连接的示例代码

    近期有一需求:前端页面点击执行任务,实时显示后端执行情况,思考一波:发现 WebSocket 最适合做这件事. 效果 测试 ping www.baidu.com 效果 点击连接建立ws连接 后端实现 所需软件包 后端主要借助Django Channels 实现socket连接,官网文档链接 这里想实现每个连接进来加入组进行广播,所以还需要引入 channels-redis . pip channels==2.2.0 channels-redis==2.4.0 引入 settings.py INS

  • 服务器远程连接提示由于协议错误,客户端无法连接到远程计算机

    今天远程连接服务器的时候提示 中断远程桌面连接 --------------------------- 由于协议错误,客户端无法连接到远程计算机. 请请重新连接到远程计算机.如果客户端依旧无法连接,请跟网络管理员联系. 用远程桌面连接服务器时报错:由于协议错误,会话将被中断.请重新连接到远程计算机. 本以为是服务器的一般性错误,以为重新启动一下服务器就能解决问题,于是让机房重启了一下服务器.可无论怎么试问题仍旧,再用其它电脑试连接,还是一样的问题,无奈只好让人去机房装了个pcAnywhere不甘

  • Websocket协议详解及简单实例代码

    Websocket协议详解 关于websocket的协议是用来干嘛的,请参考其他文章. WebSocket关键词 HTML5协议,实时,全双工通信,长连接 WebSocket比传统Http的好处 客户端与服务端只建立一个TCP连接,可以使用更少的连接 WebSocket的服务端可以将数据推送到客户端,如实时将证券信息反馈到客户端(这个很关键),实时天气数据,比http请求响应模式更灵活 更轻量的协议头,减少数据传送量 数据帧格式 下图为手工打造的数据帧格式 /** * fin |masked |

  • 基于node实现websocket协议

    一.协议 WebSocket是一种基于TCP之上的客户端与服务器全双工通讯的协议,它在HTML5中被定义,也是新一代webapp的基础规范之一. 它突破了早先的AJAX的限制,关键在于实时性,服务器可以主动推送内容 到客户端!可能的应用有:多人在线游戏,即时聊天,实时监控,远程桌面,新闻服务器等等. 对于我自己,当前最想尝试的是canvas+websocket组合起来能做什么. 二.实现 由于握手的过程是一个标准的HTTP请求,因此 websocket 的实现有两种选择:1)TCP上实现: 2)

随机推荐