问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

你好,HTML5的websocket和C#的普通Socket(非C#webSocket)能相互通信么,小弟最近也遇到这个问题了。

发布网友 发布时间:2022-04-20 03:24

我来回答

3个回答

懂视网 时间:2022-04-20 07:45

1.WebSocket通信基础知识

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 使用ws或wss协议,是下一代客户端-服务器的异步通信方法。

在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

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

而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

这里写图片描述

在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

1. Header

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

服务器可以主动传送数据给客户端,只要客户端打开的socket与服务器建立连接后,就可以把数据推送到这个socket上,从被动转为主动。

WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

2、HTML5 WebSockets API

WebSocket对象

WebSocket在DOM中是window对象的子对象,它具有:

  • WebSocket(url)构造函数。

  • readyState。只读属性,其值可以是CONNECTING(0),OPEN(1),CLOSED(3)。

  • boolean send(in DOMString data)

  • void close()两个方法,分别用于发送消息和关闭WebSocket连接

  • onopen, onmessage, 和onclosee三个事件属性,分别对open, message和close三个WebSocket事件。

    1、浏览器支持情况检测

    检测浏览器支持情况

    function loadDemo() { 
     if (window.WebSocket) { 
     //supported 
     } else { 
     // not supported 
     } 
    }

    2、WebSocket对象的创建和服务器连接

    要连接通信端点,只需要创建一个新的WebSocket实例,并提供希望连接的对端URL。ws://和wss://前缀分别表示WebSocket连接和安全的WebSocket连接。

    url = "ws://localhost:8080/echo"; w = new WebSocket(url);

    建立WebSocket连接时,可以列出Web应用能够使用的协议。WebSocket构造函数的第二个参数既可以是字符串,也可以是字符串组。

    w = new WebSocket(url, ["proto1", "proto2"]);

    假设proto1和proto2是定义明确、可能已注册且标准化的协议名称,它们能够同时为客户端和服务器端所理解。服务器会从列表中选择首选协议。

    onopen = function(e) { 
     //确定服务器选择的协议 
     log(e.target.protocol); 
    }

    3、添加事件监听器

    WebSocket编程遵循异步编程模型;打开socket后,只需等待事件发生,而不需要主动向服务器轮询,所以需要在WebSocket对象中添加回调函数来监听事件。
    WebSocket对象有三个事件:open、close和message对应有三个事件监听器onopen,onmessage,onclose来处理连接的生命周期的每个阶段,当然还可以是onerror来监听错误,如以下示例所示。

    w.onopen = function() { 
     log("open"); 
     w.send("send message"); 
    } 
    w.onmessage = function(e) { 
     log(e.data); 
    } 
    w.onclose = function(e) { 
     log("closed"); 
    } 
    w.onerror = function(e) { 
     log("error"); 
    }

    4、发送消息

    当socket处于打开状态(即onopen之后,onclose之前),可以用send方法来发送消息。消息发送完,可以调用close方法来终止连接,也可以不这么做,让其保持打开状态。

    w.send();

    你可能想测算在调用Send()函数之前,有多少数据备份在发送缓冲区中。bufferAmount属性表示已在WebSocket上发送但尚未写入网络的字节数。它对于调节发送速率很有用。

    document.getElementById("sendButton").onclick = function() { 
     if (w.bufferedAmount < bufferThreshold) { 
     w.send(document.getElementById("inputMessage").value); 
     } 
    }

    WebSocket API支持以二进制数据的形式发送Blob和ArrayBuffer实例

    var a = new Uint8Array([8, 6, 7, 5, 3, 0, 9]); 
    w.send(a.buffer);

    常量-readyState属性

    这些常量是readyState属性的取值,可以用来描述WebSocket连接的状态。

    ConstantValueDescription
    CONNECTING0连接还没开启。
    OPEN1连接已开启并准备好进行通信。
    CLOSING2连接正在关闭的过程中。
    CLOSED3连接已经关闭,或者连接无法建立。

    3.实例

    <!DOCTYPE html><html><head>
     <title>webSocket实例</title></head><body>
     <h2>webSocket实例</h2>
     <input type="text" id="text">
     <button type="" id="connect" onclick="connect()">建立连接</button>
     <button type="" id="send" onclick="send()">发送数据</button>
     <button type="" id="disconnect" onclick="disconnect()">断开连接</button>
     <p id="message"></p>
     <script type="text/javascript">
     var socket; var readyState = ["正在连接","已经连接","正在断开","已经断开"]; var message = document.getElementById('message'); function connect(){
    
      try{  var url = 'ws:localhost/test';
      socket = new webSocket(url);
      message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      socket.onopen = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      socket.onmessage = function(msg){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+'<br>'+ "接收数据" + msg.data +"</p>";
      }
      socket.onclose = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      }catch(exception){  // socket.onerror = function(){
       message.innerHTML += "<p>发生错误!"+"</p>";  // }
      }
     } function send(){
      var text = document.getElementById('text').value;  try{
      socket.send(text);
      message.innerHTML += "<p>发送数据:" + text +"</p>";
      }catch(exception){
      message.innerHTML += "<p>发送数据出错</p>";
      }
     } function disconnect(){
      socket.close();
     } </script></body></html>

    1.WebSocket通信基础知识

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 使用ws或wss协议,是下一代客户端-服务器的异步通信方法。

    在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

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

    而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

    这里写图片描述

    在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

    1. Header

    互相沟通的Header是很小的-大概只有 2 Bytes

    2. Server Push

    服务器可以主动传送数据给客户端,只要客户端打开的socket与服务器建立连接后,就可以把数据推送到这个socket上,从被动转为主动。

    WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
    Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

    2、HTML5 WebSockets API

    WebSocket对象

    WebSocket在DOM中是window对象的子对象,它具有:

  • WebSocket(url)构造函数。

  • readyState。只读属性,其值可以是CONNECTING(0),OPEN(1),CLOSED(3)。

  • boolean send(in DOMString data)

  • void close()两个方法,分别用于发送消息和关闭WebSocket连接

  • onopen, onmessage, 和onclosee三个事件属性,分别对open, message和close三个WebSocket事件。

    1、浏览器支持情况检测

    检测浏览器支持情况

    function loadDemo() { 
     if (window.WebSocket) { 
     //supported 
     } else { 
     // not supported 
     } 
    }

    2、WebSocket对象的创建和服务器连接

    要连接通信端点,只需要创建一个新的WebSocket实例,并提供希望连接的对端URL。ws://和wss://前缀分别表示WebSocket连接和安全的WebSocket连接。

    url = "ws://localhost:8080/echo"; w = new WebSocket(url);

    建立WebSocket连接时,可以列出Web应用能够使用的协议。WebSocket构造函数的第二个参数既可以是字符串,也可以是字符串组。

    w = new WebSocket(url, ["proto1", "proto2"]);

    假设proto1和proto2是定义明确、可能已注册且标准化的协议名称,它们能够同时为客户端和服务器端所理解。服务器会从列表中选择首选协议。

    onopen = function(e) { 
     //确定服务器选择的协议 
     log(e.target.protocol); 
    }

    3、添加事件监听器

    WebSocket编程遵循异步编程模型;打开socket后,只需等待事件发生,而不需要主动向服务器轮询,所以需要在WebSocket对象中添加回调函数来监听事件。
    WebSocket对象有三个事件:open、close和message对应有三个事件监听器onopen,onmessage,onclose来处理连接的生命周期的每个阶段,当然还可以是onerror来监听错误,如以下示例所示。

    w.onopen = function() { 
     log("open"); 
     w.send("send message"); 
    } 
    w.onmessage = function(e) { 
     log(e.data); 
    } 
    w.onclose = function(e) { 
     log("closed"); 
    } 
    w.onerror = function(e) { 
     log("error"); 
    }

    4、发送消息

    当socket处于打开状态(即onopen之后,onclose之前),可以用send方法来发送消息。消息发送完,可以调用close方法来终止连接,也可以不这么做,让其保持打开状态。

    w.send();

    你可能想测算在调用Send()函数之前,有多少数据备份在发送缓冲区中。bufferAmount属性表示已在WebSocket上发送但尚未写入网络的字节数。它对于调节发送速率很有用。

    document.getElementById("sendButton").onclick = function() { 
     if (w.bufferedAmount < bufferThreshold) { 
     w.send(document.getElementById("inputMessage").value); 
     } 
    }

    WebSocket API支持以二进制数据的形式发送Blob和ArrayBuffer实例

    var a = new Uint8Array([8, 6, 7, 5, 3, 0, 9]); 
    w.send(a.buffer);

    常量-readyState属性

    这些常量是readyState属性的取值,可以用来描述WebSocket连接的状态。

    ConstantValueDescription
    CONNECTING0连接还没开启。
    OPEN1连接已开启并准备好进行通信。
    CLOSING2连接正在关闭的过程中。
    CLOSED3连接已经关闭,或者连接无法建立。

    3.实例

    <!DOCTYPE html><html><head>
     <title>webSocket实例</title></head><body>
     <h2>webSocket实例</h2>
     <input type="text" id="text">
     <button type="" id="connect" onclick="connect()">建立连接</button>
     <button type="" id="send" onclick="send()">发送数据</button>
     <button type="" id="disconnect" onclick="disconnect()">断开连接</button>
     <p id="message"></p>
     <script type="text/javascript">
     var socket; var readyState = ["正在连接","已经连接","正在断开","已经断开"]; var message = document.getElementById('message'); function connect(){
    
      try{  var url = 'ws:localhost/test';
      socket = new webSocket(url);
      message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      socket.onopen = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      socket.onmessage = function(msg){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+'<br>'+ "接收数据" + msg.data +"</p>";
      }
      socket.onclose = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      }catch(exception){  // socket.onerror = function(){
       message.innerHTML += "<p>发生错误!"+"</p>";  // }
      }
     } function send(){
      var text = document.getElementById('text').value;  try{
      socket.send(text);
      message.innerHTML += "<p>发送数据:" + text +"</p>";
      }catch(exception){
      message.innerHTML += "<p>发送数据出错</p>";
      }
     } function disconnect(){
      socket.close();
     } </script></body></html>

    热心网友 时间:2022-04-20 04:53

    我试过,可以是可以,但websocket会想http协议一样加上许多头部信息,c#端发送和接收过程中都需要处理

    热心网友 时间:2022-04-20 06:11

    答案是肯定的不行
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    小弟刚升到80级是法师 应该怎么弄装备啊 从哪里开始弄起 还有就是网上... 门上指纹锁要多少钱 手机百度如何搜索图片来源? 如何找出图片出处 win7电脑横屏如何处理笔记本电脑桌面变成横向了怎么办 win7电脑桌面反了怎么办电脑屏幕倒过来了怎么办 win7电脑变成竖屏快捷键我电脑变成竖屏了怎么调回来 win7系统电脑怎么横屏w7系统屏幕怎么横过来 win7系统更改电脑屏幕方向电脑屏幕旋转了怎么调整过来 调成竖屏模式电脑win7我电脑变成竖屏了怎么调回来 迦蓝道可信任吗? 韩国hp品牌羽绒服官网 韩国明星冬天穿的羽绒服怎么都是特别厚的那种,几乎是一个种类! 有种韩国的羽绒服有个黑猫圆圈标志的是什么牌子的衣服? 像鹿的标志的羽绒服韩国牌子 WebSocket是什么原理? 海天注塑机滤网阻塞怎么清除警报 滤网计数已到达设定时间是什么意思 spes海盐洁发膏是酸性还是碱性 spes诗裴丝防脱洗发水好用么?用过的来说说! 有没有谁用过Spes诗裴丝防脱洗发水,效果怎么样? 求一款防脱效果好的洗发水!Spes诗裴丝洗发水怎么样 有没有什么好的防脱洗发水推荐?Spes诗裴丝洗发水怎么样 请问有人知道Spes诗裴丝这个牌子吗?看到有博主推荐它们家的洗发水,有用过的吗?求真实分享。? 哪个牌子的洗发水防脱发效果好?spes诗裴丝洗发水怎么样 掉头发很严重怎么办?spes洗发水真的可以防脱吗 有用过spes家产品的么?它家的洗发水怎么样 请问有人用过Spes诗裴丝这个牌子的洗发护发产品吗?最近掉发严重,想换这个牌子试试。 spes在线下超市有吗 Spes诗裴丝的洗发水好用吗?有硅油吗? 糯米元子的做法 我炸的元子皮很厚不好吃是什原因 请问家装对智能家居的需求情况如何? CAv智能家居行业情况? 网上注册营业执照身份认证不了是怎么回事 中国和国外做智能家居最强的都是什么公司?以及最新国内外研究动态 智能家居的竞争情况及存在问题、发展思路 小米6该用哪个版本的模拟器 小米手机账号怎样在安卓模拟器上登 电脑手游模拟器能下载小米版本的手机游戏吗 安卓模拟器怎么成功安装部落冲突小米版? 2009年霹雳火命农历六月初六女孩下午十五点三十五出生五行缺什么取名用什么字? 火命取名带火字旁好还是带水字旁好 VMware 虚拟机模块“disk”启动失败 vmware父虚拟磁盘的容量与子磁盘的容量不同 服务器连接外接的存储器时无法启动 如何做羊肉不膻? 为什么这个洗衣机底部的螺丝左右都拧不下来?拧到一半就拧不动了 因以下文件的损坏或丢失 windows无法启动:&lt;windows root&gt;&#92;system32&#92;hal.dll 我的电脑启动不正常,有时候是蓝屏,有时候就在出黑字的时候停了。