WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
今天在这里我会用C#搭建WebSocket服务端演示WebSocket的通信过程
一、WebSocket中的事件、属性和方法
属性:
Socket.readyState 只读属性 readyState 表示连接状态,可以是以下值: 0 - 表示连接尚未建立。 1 - 表示连接已建立,可以进行通信。 2 - 表示连接正在进行关闭。 3 - 表示连接已经关闭或者连接不能打开。
Socket.bufferedAmount 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数
事件:
事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose 连接关闭时触发
方法:
Socket.send() 使用连接发送数据
Socket.close() 关闭连接
二、有了大概的了解接下来就开始实现这么一个实例
1.客户端
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body > <div style="margin-left: 650px;"> <form id="Form"> <input type="input" name="" id="SendInfo" value="" /> <button type="submit">提交</button> </form> <div id="hello" style="border: dashed 1px black;height: 500px;width: 500px;margin-top: 10px;"> </div> </div> </body> <script type="text/javascript"> var test=function(){ var print=document.getElementById('hello'); var form = document.getElementById('Form'); var input = document.getElementById('SendInfo'); print.innerHTML += "connecting to server ..<br/>"; window.ws = new WebSocket('ws://localhost:9898/'); //监听webscoket服务端口 //监听消息状态 ws.onmessage=function(eve){ print.innerHTML+=eve.data+'<br/>' } //监听链接状态 ws.onopen=function(){ print.innerHTML+='connection open <br/>' } //监听关闭状态 ws.onclose = function () { print.innerHTML += 'connection closed<br/>'; } //向服务器端发送消息 form.addEventListener('submit',function(e){ e.preventDefault(); var val="客户端:"+input.value; ws.send(val); input.value=""; }) } window.onload=test(); </script> </html>
2.服务端创建一个C#控制台程序
using Fleck; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WebScoket { class Program { static void Main(string[] args) { var allScokets = new List<IWebSocketConnection>(); var server = new WebSocketServer("ws://127.0.0.1:9898"); //创建webscoket服务端实例 server.Start(scoket=> { scoket.OnOpen = () => { Console.WriteLine("Open"); allScokets.Add(scoket); }; scoket.OnClose = () => { Console.WriteLine("Close"); allScokets.Remove(scoket); }; scoket.OnMessage =message => { Console.WriteLine(message); allScokets.ToList().ForEach(s=>s.Send(message)); }; }); var input = Console.ReadLine(); while (input != "exit") { foreach (var socket in allScokets.ToList()) { socket.Send("服务端:"+input); } input = Console.ReadLine(); } } } }
3.运行效果