zoukankan      html  css  js  c++  java
  • C# WebSocket 及时通信协议

    1、什么是WebSocket

      WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    2、WebSocket和Socket区别

      ①、原理上的区别:

      Socket是传输控制层协议,WebSocket是应用层协议。

      Socket是应用层与2113TCP/IP协议族通信的中间软件抽象层,它是一组接口(不是协议,为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的

      一组接口)。

      在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。利用TCP/IP协议建立TCP连接。(TCP连接则更依靠于底层的IP协议,

      IP协议的连接则依赖于链路层等更低层次。)

      WebSocket则是一个典型的应用层协议。

      ②、灵活运用的程度不同:

      WebSocket 更易用,而 Socket 更灵活。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

      在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合

      指定的协议。

      主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层

       IP 协议来寻址网络中的主机。

      网络层使用5261的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD

      的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。

      而 WebSocket 则不同,它4102是一个完整的 应用层协议,包含一套标准的 API 。

      ③、传输层次不同:

      Socket 是传输控制层的接口。用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。

      网络中的 Socket 并不是什么协议,而是为了使用 TCP,UDP 而抽象出来的一层 API,它是位于应用层和传输层之间的一个抽象层。Socket 是对 TCP/IP 的封装;HTTP 是

      轿车,提供了封装或者显示数据的具体形式;Socket 是发动机,提供了网络通信的能力。

      在 Unix 一切皆文件哲学的思想下,Socket 是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供

      对方读取或者读取对方内容,通讯结束时关闭文件。

      WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

      在 WebSocket API 中,1653浏览器和服务器只需要完成一次 HTTP 握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    3、服务器代码

    static void Main(string[] args)
            {
                FleckLog.Level = LogLevel.Debug;
    
                var allSockets = new List<IWebSocketConnection>();
    
                var server = new WebSocketServer("ws://0.0.0.0:7181");
    
                server.Start(socket =>
    
                {
    
                    socket.OnOpen = () =>
    
                    {
                        Console.WriteLine("Open!");
    
                        allSockets.Add(socket);
    
                    };
    
                    socket.OnClose = () => // 当关闭Socket链接十执行此方法
    
                    {
    
                        Console.WriteLine("Close!");
    
                        allSockets.Remove(socket);
    
                    };
    
                    socket.OnMessage = message => // 接收客户端发送过来的信息
    
                    {
    
                        Console.WriteLine(message);
    
                        allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
    
                    };
    
                });
    
    
                var input = Console.ReadLine();
                while (input != "exit")
                {
                    foreach (var socket in allSockets.ToList())
                    {
                        socket.Send(input);
                    }
                    input = Console.ReadLine();
                }
    
            }

    4、客户端代码

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <script type="text/javascript">
            var start = function () {
                var inc = document.getElementById('incomming');
                var wsImpl = window.WebSocket || window.MozWebSocket;
                var submit = document.getElementById('submit');
                var input = document.getElementById('sendText');
    
                inc.innerHTML += "connecting to server ..<br/>";
    
                // 创建新的websocket新连接端口为7181
                window.ws = new wsImpl('ws://localhost:7181/');
    
                // 当数据从服务器服务中心发送后,继续向下运行过程
                ws.onmessage = function (evt) {
                    inc.innerHTML += evt.data + '<br/>';
                };
    
                // 当链接对象找到服务端成功对接后,提示正常打开
                ws.onopen = function () {
                    inc.innerHTML += '.. connection open<br/>';
                };
    
                // 当链接对象未找找到服务端成功对接后,提示打开失败,别切单项关闭
                ws.onclose = function () {
                    inc.innerHTML += '.. connection closed<br/>';
                }
    
                submit.onclick = function () {
                    var val = input.value;
                    ws.send(val);
                    input.value = "";
                };
            }
            window.onload = start;
        </script>
    
    </head>
    <body>
            <div>
                 <input id="sendText" placeholder="Text To Send" /><input type="button" id="submit" value="提交" />
            </div>
        <pre id="incomming"></pre>
    </body>
    </html>
  • 相关阅读:
    使用手机游戏的新闻推送
    win8.1 64位环境建设android开发环境
    LeetCode: Multiply Strings. Java
    Thread.join()分析方法
    字幕效果的幻灯片出现在网站上的图片
    JAVA技术交流群
    Android使得手机拍照功能的发展(源共享)
    领导基础课程
    Mysql开启远程连接方法
    mysql远程连接命令
  • 原文地址:https://www.cnblogs.com/duhaoran/p/13043763.html
Copyright © 2011-2022 走看看