zoukankan      html  css  js  c++  java
  • 用C#搭建WebSocket

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

     

      

      

  • 相关阅读:
    java.lang.IllegalArgumentException: No converter found for return value of type: class XXX.XXXX
    关于websocket集群中不同服务器的用户间通讯问题
    JavaScript中 location.host 与 location.hostname 的区别
    Spring在代码中获取bean的几种方式
    在websocket中怎么样注入service类
    阿里云上部署kafka--遇到的坑
    linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known
    解决bash: mysql: command not found 的方法
    Nginx的启动、停止与重启
    Java8:Lambda表达式增强版Comparator和排序
  • 原文地址:https://www.cnblogs.com/HTLucky/p/11693645.html
Copyright © 2011-2022 走看看