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>
原文地址:https://www.cnblogs.com/duhaoran/p/13043763.html