欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用C#搭建WebSocket

程序员文章站 2022-06-05 18:45:59
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, ......

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.运行效果

 用C#搭建WebSocket