精华内容
下载资源
问答
  • WebSocket与Socket区别

    2020-03-06 13:34:45
    WebSocket与Socket的关系 Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。 早期互联网时代有人最先把TCP/IP协议封装在操作系统中,然后以Socket...

    WebSocket与Socket的关系

    Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。

    早期互联网时代有人最先把TCP/IP协议封装在操作系统中,然后以Socket接口形式提供给上层应用使用,后来为了方便在不同的技术栈实现,逐渐抽象出了一组接口,最后甚至成为了事实标准,甚至还把其他网络通信协议封装到Socket接口中。

    当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。

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

     

    区别

    Socket是对TCP协议和IP协议的封装,本身不是通信协议,WebSocket是应用层协议。

    WebSocket与HTTP的关系

    相同点

    • 1. 都是一样基于TCP的,都是可靠性传输协议。
    • 2. 都是应用层协议。

    不同点

    • 1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
    • 2. WebSocket是需要握手进行建立连接的。

    联系

    WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。

    HTML5与WebSocket的关系

    WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。

    实际上,许多语言、框架和服务器都提供了 WebSocket 支持,例如:

    • * 基于 C 的 libwebsocket.org
    • * 基于 Node.js 的 Socket.io
    • * 基于 Python 的 ws4py
    • * 基于 C++ 的 WebSocket++
    • * Apache 对 WebSocket 的支持: Apache Module mod_proxy_wstunnel
    • * Nginx 对 WebSockets 的支持: NGINX as a WebSockets Proxy 、 NGINX Announces Support for WebSocket Protocol 、WebSocket proxying
    • * lighttpd 对 WebSocket 的支持:mod_websocket
    展开全文
  • 二、WebSocket服务端功能实现 1、由于有使用到log4net,在开始实现功能前,需要对log4net进行相关设置,设置参考https://blog.csdn.net/liwan09/article/details/106266346 2、界面设置 3、实现功能代码 ...

    一、项目创建

    1、VS2017创建winform项目

    2、Nuget中搜索安装 SuperWebSocketNETServer

    二、WebSocket服务端功能实现

    1、由于有使用到log4net,在开始实现功能前,需要对log4net进行相关设置,设置参考https://blog.csdn.net/liwan09/article/details/106266346

    2、界面设置

     

    3、实现功能代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.Windows.Forms;
    using SuperWebSocket;
    using log4net;
    using Bosch.Rtns.Sockect.Model;
    using Bosch.Rtns.Sockect.CommonUtils;
    
    namespace Bosch.Rtns.Sockect
    {
        public partial class frmMain : Form
        {
            private WebSocketServer webSocketServer;
            ILog loggerManager;
            Dictionary<WebSocketSession, string> socketSessionList = new Dictionary<WebSocketSession, string>();//记录链接的客户端数据
    
            public frmMain()
            {
                InitializeComponent();
            }
            /// <summary>
            /// load
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void frmMain_Load(object sender, EventArgs e)
            {
                loggerManager=LogManager.GetLogger("Logger");
                txtIPAddress.Text = "127.0.0.1";
                txtPort.Text = "1414";
                btnEnd.Enabled = false;
            }
            /// <summary>
            ///开启服务
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnStart_Click(object sender, EventArgs e)
            {
                string ipAddress = txtIPAddress.Text.Trim();
                string port = txtPort.Text.Trim();
                if (string.IsNullOrEmpty(ipAddress))
                {
                    txtIPAddress.Focus();
                    MessageBox.Show("请输入IP地址!");
                    return;
                }
                if (string.IsNullOrEmpty(port))
                {
                    txtPort.Focus();
                    MessageBox.Show("请输入端口号!");
                    return;
                }           
                webSocketServer = new WebSocketServer();
                webSocketServer.NewSessionConnected += Sockect_NewSessionConnected;
                webSocketServer.NewMessageReceived += Sockect_NewMessageReceived;
                webSocketServer.SessionClosed += Sockect_SessionClosed;
                if (!webSocketServer.Setup(ipAddress,Convert.ToInt32(port)))
                {
                    txtLogInfo.Text += "设置Socket服务侦听地址失败!\r\n";
                    loggerManager.Error("设置Socket服务侦听地址失败!\r\n");
                    return;
                }
                if (!webSocketServer.Start())
                {
                    txtLogInfo.Text += "启动WebSocket服务侦听失败!\r\n";
                    loggerManager.Error("启动WebSocket服务侦听失败!\r\n");
                    return;
                }
                txtLogInfo.Text += "Socket启动服务成功!\r\n";
                loggerManager.Info("Socket启动服务成功!\r\n");
                txtIPAddress.Enabled = false;
                txtPort.Enabled = false;
                btnStart.Enabled = false;
                btnEnd.Enabled = true;
            }
            /// <summary>
            /// 关闭服务
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnEnd_Click(object sender, EventArgs e)
            {
                if (webSocketServer != null)
                {
                    webSocketServer.Stop();
                    webSocketServer = null;
                }
                txtIPAddress.Enabled = true;
                txtPort.Enabled = true;
                btnStart.Enabled = true;
                btnEnd.Enabled = false;
            }
    
            /// <summary>
            /// 新的Socket连接事件
            /// </summary>
            /// <param name="session"></param>
            private void Sockect_NewSessionConnected(WebSocketSession session)
            {
                string logMsg = string.Format("{0} 与客户端{1}创建新会话", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), GetwebSocketSessionName(session))+"\r\n";            
                this.Invoke(new Action(() =>
                {
                    txtLogInfo.Text += logMsg;
                }));
                loggerManager.Info(logMsg);
                socketSessionList.Add(session, "");
            }
            /// <summary>
            /// 消息接收事件
            /// </summary>
            /// <param name="session"></param>
            /// <param name="value">接收的消息</param>
            private void Sockect_NewMessageReceived(WebSocketSession session, string value)
            {
                string logMsg = string.Format("{0} 从客户端{1}接收新的消息:\r\n{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), GetwebSocketSessionName(session),value) + "\r\n";
                this.Invoke(new Action(() =>
                {
                    txtLogInfo.Text += logMsg;
                }));
                loggerManager.Info(logMsg);
                ReceiveData receiveData = JsonHelper.ConvertToEntity<ReceiveData>(value);
                //退出登录
                if (receiveData.MessageType == "3")
                {
                    //调用weiapi接口,更新在线用户的在线状态
                    socketSessionList.Remove(session);
                    session.Close(SuperSocket.SocketBase.CloseReason.ClientClosing);//断开连接
                }
                else
                {
                    if(receiveData.MessageType == "4")//设备故障推送
                    {
                        EquipmentFault equipmentFault = JsonHelper.ConvertToEntity<EquipmentFault>(receiveData.MessageContent);
                    }
                    else
                    {
                        socketSessionList[session] = receiveData.MessageContent;//记录app端的设备id
                    }
                }
            }
            /// <summary>
            /// sockect客户端断开连接事件
            /// </summary>
            /// <param name="session"></param>
            /// <param name="value"></param>
            private void Sockect_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
            {
                string logMsg = string.Format("{0} 与客户端{1}的会话被关闭 原因:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), GetwebSocketSessionName(session), value) + "\r\n";
                this.Invoke(new Action(() =>
                {
                    txtLogInfo.Text += logMsg;
                }));
                loggerManager.Info(logMsg);
                socketSessionList.Remove(session);
            }
            /// <summary>
            /// 获取连接的客户端的ip地址
            /// </summary>
            /// <param name="webSocketSession"></param>
            private static string GetwebSocketSessionName(WebSocketSession webSocketSession)
            {
                string id= HttpUtility.UrlDecode(webSocketSession.SessionID);//获取sessionid
                var remoteClient = webSocketSession.RemoteEndPoint;
                return remoteClient.Address + ":" + remoteClient.Port.ToString();
            }
            /// <summary>
            /// 发送消息
            /// </summary>
            /// <param name="session"></param>
            /// <param name="msg"></param>
            private void SendMessage(WebSocketSession session, string msg)
            {
                //向所有客户端发送消息
                //foreach (var sendSession in session.AppServer.GetAllSessions())
                //{
                //    sendSession.Send(msg);
                //}
                session.Send(msg);//向指定的客户端发送消息
            }
        }
    }
    

     相关实体类代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Bosch.Rtns.Sockect.Model
    {
        /// <summary>
        /// 设备故障信息
        /// </summary>
        public class EquipmentFault
        {
            /// <summary>
            /// 目标手机设备ID
            /// </summary>
            public string TargetPhoneID { get; set; }
            /// <summary>
            /// 故障发生时间
            /// </summary>
            public DateTime FaultTime { get; set; }
            /// <summary>
            /// 消息id
            /// </summary>
            public string MessageUID { get; set; }
            /// <summary>
            /// 消息标题
            /// </summary>
            public string MessageTitle { get; set; }
            /// <summary>
            /// 发送给App(消息类型)
            /// </summary>
            public string SubAPPname { get; set; }
            /// <summary>
            /// 故障等级 Low,Default,High,Emergent
            /// </summary>
            public string EmergenceLevel { get; set; }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Bosch.Rtns.Sockect.Model
    {
        /// <summary>
        /// 接收的消息
        /// </summary>
        public class ReceiveData
        {
            /// <summary>
            /// 接收的消息类型 1:App端登录  2:设备故障信息推送
            /// </summary>
            public string MessageType { get; set; }
            /// <summary>
            /// 消息内容
            /// </summary>
            public string MessageContent { get; set; }
        }
    }
    

    Json帮助类代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
    namespace Bosch.Rtns.Sockect.CommonUtils
    {
        /// <summary>
        /// Json帮助类
        /// </summary>
        public class JsonHelper
        {
            /// <summary>
            /// object转json
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string ConvertObjToJson(object obj)
            {
                return JsonConvert.SerializeObject(obj);
            }
            /// <summary>
            /// Json字符串转实体类数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="jsonValue"></param>
            /// <returns></returns>
            public static T ConvertToEntity<T>(string jsonValue)
            {
                return JsonConvert.DeserializeObject<T>(jsonValue);
            }
            /// <summary>
            /// Json字符串转List<T>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="jsonValue"></param>
            /// <returns></returns>
            public static List<T> ConvertToList<T>(string jsonValue)
            {
                return JsonConvert.DeserializeObject<List<T>>(jsonValue);
            }
        }
    }
    

    4、客户端代码(html)

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>Web sockets test</title>
        <script src="jquery-min.js"></script>
    </head>
    <body>
        <div>
            服务器地址:<input type="text" id="serverAddress" value="127.0.0.1:4141" />
            <button type="button" onclick="connectionServer();">连接</button>
            <button type="button" onclick="DisconnectionServer()">断开</button>
        </div>
        <div>
            <button type="button" onclick="senMsg()">发送消息</button>
            <div>
                <textarea id="txtmsg" style="height:200px;width:300px"></textarea>
            </div>
        </div>
    </body>
    </html>
    <script type="text/javascript">
        var ws;
        var SocketCreated = false;
        var isUserloggedout = false;
        var defaultMsg = "{\"MessageType\":\"\",\"MessageContent\":\"\"}";
        document.getElementById("txtmsg").value = defaultMsg;
    
        function connectionServer() {
            try {
                if ("WebSocket" in window) {
                    ws = new WebSocket("ws://" + document.getElementById("serverAddress").value);
                }
                else if ("MozWebSocket" in window) {
                    ws = new MozWebSocket("ws://" + document.getElementById("serverAddress").value);
                }
                SocketCreated = true;
                isUserloggedout = false;
            } catch (ex) {
                alert("连接失败");
                return;
            }
        }
    
        function DisconnectionServer() {
            if (SocketCreated && (ws.readyState == 0 || ws.readyState == 1)) {
                SocketCreated = false;
                isUserloggedout = true;
                ws.close();
            }
        }
    
        function senMsg() {
            if (SocketCreated) {
                var msg = document.getElementById("txtmsg").value;
                ws.send(msg);
            }
        }
    </script>

     

    展开全文
  • websocket 与Socket.IO介绍

    2018-03-30 13:49:27
    websocket 与Socket.IO介绍 一 websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就...

    websocket 与Socket.IO介绍
    一 websocket

    WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协 议草案的不断变化,各个浏览器对协议的实现也在不停的更新。该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了。

    1. WebSocket API

    首先看一段简单的javascript代码,该代码调用了WebSockets的API。

    var ws = new WebSocket(“ws://echo.websocket.org”);

    ws.onopen = function(){ws.send(“Test!”); };

    ws.onmessage = function(evt){console.log(evt.data);ws.close();};

    ws.onclose = function(evt){console.log(“WebSocketClosed!”);};

    ws.onerror = function(evt){console.log(“WebSocketError!”);};

    这份代码总共只有5行,现在简单概述一下这5行代码的意义。

    第一行代码是在申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。

    第二行到第五行为WebSocket对象注册消息的处理函数,WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror,当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败,发送、接收数据 失败或者处理数据出现错误,browser会触发onerror消息;当Browser接收到WebSocketServer发送过来的数据时,就会触发 onmessage消息,参数evt中包含server传输过来的数据;当Browser接收到WebSocketServer端发送的关闭连接请求时, 就会触发onclose消息。我们可以看出所有的操作都是采用消息的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。

    2 为什么引入WebSocket协议?

    Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议,在建立连接后,它只 允许Browser/UA(UserAgent)向WebServer发出请求资源后,WebServer才能返回相应的数据。而WebServer不能 主动的推送数据给Browser/UA,当初这么设计http协议也是有原因的,假设WebServer能主动的推送数据给Browser/UA,那 Browser/UA就太容易受到攻击,一些广告商也会主动的把一些广告信息在不经意间强行的传输给客户端,这不能不说是一个灾难。那么单向的http协 议给现在的网站或Web应用程序开发带来了哪些问题呢?

    让我们来看一个案例,现在假设我们想开发一个基于Web的应用程序去获取当前Web服务器的实时数据,例如股票的实时行情,火车票的剩余票数等等,这就需 要Browser/UA与WebServer端之间反复的进行http通信,Browser不断的发送Get请求,去获取当前的实时数据。下面介绍几种常 见的方式:

    1. Polling

    这种方式就是通过Browser/UA定时的向Web服务器发送http的Get请求,服务器收到请求后,就把最新的数据发回给客户端(Browser /UA),Browser/UA得到数据后,就将其显示出来,然后再定期的重复这一过程。虽然这样可以满足需求,但是也仍然存在一些问题,例如在某段时间 内Web服务器端没有更新的数据,但是Browser/UA仍然需要定时的发送Get请求过来询问,那么Web服务器就把以前的老数据再传送过 来,Browser/UA把这些没有变化的数据再显示出来,这样显然既浪费了网络带宽,又浪费了CPU的利用率。如果说把Browser发送Get请求的 周期调大一些,就可以缓解这一问题,但是如果在Web服务器端的数据更新很快时,这样又不能保证Web应用程序获取数据的实时性。

    1. Long Polling

    上面介绍了Polling遇到的问题,现在介绍一下LongPolling,它是对Polling的一种改进。

    Browser/UA发送Get请求到Web服务器,这时Web服务器可以做两件事情,第一,如果服务器端有新的数据需要传送,就立即把数据发回给 Browser/UA,Browser/UA收到数据后,立即再发送Get请求给Web Server;第二,如果服务器端没有新的数据需要发送,这里与Polling方法不同的是,服务器不是立即发送回应给Browser/UA,而是把这个 请求保持住,等待有新的数据到来时,再来响应这个请求;当然了,如果服务器的数据长期没有更新,一段时间后,这个Get请求就会超 时,Browser/UA收到超时消息后,再立即发送一个新的Get请求给服务器。然后依次循环这个过程。

    这种方式虽然在某种程度上减小了网络带宽和CPU利用率等问题,但是仍然存在缺陷,例如假设服务器端的数据更新速率较快,服务器在传送一个数据包给 Browser后必须等待Browser的下一个Get请求到来,才能传递第二个更新的数据包给Browser,那么这样的话,Browser显示实时数 据最快的时间为2×RTT(往返时间),另外在网络拥塞的情况下,这个应该是不能让用户接受的。另外,由于http数据包的头部数据量往往很大(通常有 400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。

    通过上面的分析可知,要是在Browser能有一种新的网络协议,能支持客户端和服务器端的双向通信,而且协议的头部又不那么庞大就好了。WebSocket就是肩负这样一个使命登上舞台的。

    3 websocket协议

    WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两 点:1.WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像 Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;2.WebSocket需要通过握手连接,类 似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。

    下面是一个简单的建立握手的时序图:
    这里写图片描述

    这里简单说明一下WebSocket握手的过程。

    当Web应用程序调用new WebSocket(url)接口时,Browser就开始了与地址为url的WebServer建立握手连接的过程。

    1. Browser与WebSocket服务器通过TCP三次握手建立连接,如果这个建立连接失败,那么后面的过程就不会执行,Web应用程序将收到错误消息通知。

    2. 在TCP建立连接成功后,Browser/UA通过http协议传送WebSocket支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端。

    例如:

    GET /chat HTTP/1.1

    Host: server.example.com

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==

    Origin: http://example.com

    Sec-WebSocket-Protocol: chat,superchat

    Sec-WebSocket-Version: 13

    1. WebSocket服务器收到Browser/UA发送来的握手请求后,如果数据包数据和格式正确,客户端和服务器端的协议版本号匹配等等,就接受本次握手连接,并给出相应的数据回复,同样回复的数据包也是采用http协议传输。

    HTTP/1.1 101 Switching Protocols

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    Sec-WebSocket-Protocol: chat

    1. Browser收到服务器回复的数据包后,如果数据包内容、格式都没有问题的话,就表 示本次连接成功,触发onopen消息,此时Web开发者就可以在此时通过send接口想服务器发送数据。否则,握手连接失败,Web应用程序会收到 onerror消息,并且能知道连接失败的原因。

    4 websocket与TCP,HTTP的关系

    WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,Web开发者调用的WebSocket的send函数在browser 的实现中最终都是通过TCP的系统接口进行传输的。WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?答案是肯定 的,WebSocket在建立握手连接时,数据是通过http协议传输的,正如我们上一节所看到的“GET/chat HTTP/1.1”,这里面用到的只是http协议一些简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。

    具体关系可以参考下图:

    这里写图片描述

    5 websocket server

    如果要搭建一个Web服务器,我们会有很多选择,市场上也有很多成熟的产品供我们应用,比如开源的Apache,安装后只需简单的配置(或者默认配置)就可 以工作了。但是如果想搭建一个WebSocket服务器就没有那么轻松了,因为WebSocket是一种新的通信协议,目前还是草案,没有成为标准,市场 上也没有成熟的WebSocket服务器或者Library实现WebSocket协议,我们就必须自己动手写代码去解析和组装WebSocket的数据 包。要这样完成一个WebSocket服务器,估计所有的人都想放弃,幸好的是市场上有几款比较好的开源库供我们使用,比如 PyWebSocket,WebSocket-Node, LibWebSockets等等,这些库文件已经实现了WebSocket数据包的封装和解析,我们可以调用这些接口,这在很大程度上减少了我们的工作 量。如

    下面就简单介绍一下这些开源的库文件。

    1. PyWebSocket

    PyWebSocket采用Python语言编写,可以很好的跨平台,扩展起来也比较简单,目前WebKit采用它搭建WebSocket服务器来做LayoutTest。

    我们可以获取源码通过下面的命令

    svn checkouthttp://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only

    更多的详细信息可以从http://code.google.com/p/pywebsocket/获取。

    1. WebSocket-Node

    WebSocket-Node采用JavaScript语言编写,这个库是建立在nodejs之上的,对于熟悉JavaScript的朋友可参考一下,另外Html5和Web应用程序受欢迎的程度越来越高,nodejs也正受到广泛的关注。

    我们可以从下面的连接中获取源码

    https://github.com/Worlize/Websocket-Node

    1. LibWebSockets

    LibWebSockets采用C/C++语言编写,可定制化的力度更大,从TCP监听开始到封包的完成我们都可以参与编程。

    我们可以从下面的命令获取源代码

    git clone git://git.warmcat.com/libwebsockets

    值得一提的是:websocket是可以和http共用监听端口的,也就是它可以公用端口完成socket任务。

    二 Socket.io

    node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验,于是socket.io诞生。Socket.io将Websocket和轮询 (Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。也就是说,Websocket仅仅是 Socket.io实现实时通信的一个子集。那么,Socket.io都实现了Polling中的那些通信机制呢?

    Adobe® Flash® Socket
    AJAX long polling
    AJAX multipart streaming
    Forever Iframe
    JSONP Polling
    Adobe® Flash® Socket 大部分PC浏览器都支持的socket模式,不过是通过第三方嵌入到浏览器,不在W3C规范内,所以可能将逐步被淘汰,况且,大部分的手机浏览器都不支持这种模式。

    AJAX long polling 这个很好理解,所有浏览器都支持这种方式,就是定时的向服务器发送请求,缺点是会给服务器带来压力并且出现信息更新不及时的现象。

    AJAX multipart streaming 这是在XMLHttpRequest对象上使用某些浏览器(比如说Firefox)支持的multi-part标志。Ajax请求被发送给服务器端并保 持打开状态(挂起状态),每次需要向客户端发送信息,就寻找一个挂起的的http请求响应给客户端,并且所有的响应都会通过统一连接来写入

    var xhr = $.ajaxSettings.xhr();
    xhr.multipart =true;
    xhr.open('GET', 'ajax', true);
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        processEvents($.parseJSON(xhr.responseText));
      }
    };
    xhr.send(null);

    Forever Iframe (永存的Iframe)技术涉及了一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。 每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一 script标签,标签中的内容就会得到执行。这种方式的缺点是接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被 断开了,并且Iframe标签在浏览器中将被逐步取消使用。

    JSONP Polling JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求,详细请搜索查询jsonp的内容。

    展开全文
  • websocket与socket的区别一

    千次阅读 2018-06-01 11:15:21
    什么是websocket?...即浏览器可以向服务端发送信息,服务端也可以向浏览器发送信息,websocket对浏览器的支持:eg IE10+、Chrome13+、Firefox6+,实际上Websocket是通过一个socket实现双工异步通信能力的。...

    什么是websocket?

    WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。Websocket为服务器和浏览器提供了双工异步通信功能,即浏览器可以向服务端发送信息,服务端也可以向浏览器发送信息,websocket对浏览器的支持:eg IE10+、Chrome13+、Firefox6+,实际上Websocket是通过一个socket来实现双工异步通信能力的。

    wbesocket的原理

    Websocket同http一样都是应用层的协议,但它是一种双向通信协议,建立在TCP之上的。http是单向。

    websocket和socket的区别是什么?

    Socket并不是一个协议,而是抽象出来的一层,应用于应用层和传输控制层之间的一组接口,eyi

    区别:Socket是传输控制层协议,websocket是应用层协议

    Websocket是什么样的协议,具体有什么优点

    首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。
    简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
    1) HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么HTTP1.0,这次HTTP请求就结束了。
    在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
    但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。

    ajax轮询、long poll是非常消耗资源的:
    ajax轮询 需要服务器有很快的处理速度和资源。(速度)
    long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

    在这种情况下、websocket就出现了,websocket可以主动给客户端推送消息了,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
    这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况

    展开全文
  • 大家参与的项目里多少都会有web serverbrowser需要长连接互联的场景,当然我也是,之前没有进行太多方案的调研(比如深入理解通信协议和通用的一些解决方案),所以websocket就不假思索地直接用了,包括去年写的...
  • WebSocket与socket的区别

    2018-04-09 13:42:06
    实现了浏览器服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。——百度百科目的:即时通讯,替代轮询网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力通常是采用...
  • WebSocket: 介绍:WebSocket 协议是HTML5 的一种新协议,可实现浏览器/移动端和服务器建立全双工通信。 原理:WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信...WebSocket与HTTP的关系: 相同点: ...
  • websocket 与Socket.IO联系

    2018-01-16 19:28:17
    WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协 议草案的不断变化,...
  • 全面理解WebSocket与Socket、TCP、HTTP的关系及区别 转:http://www.webzsky.com/?p=1388 1.什么是WebSocket及原理 WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生,...
  • WebSocket实现与服务器通信

    千次阅读 2017-04-06 21:17:27
    WebSocket 改变了传统的HTTP协议的通信方式...WebSocket的一个关键且重要的属性:Socket.readyState 只读属性 readyState 表示连接状态,可以是以下值: 0 - 表示连接尚未建立。 1 - 表示连接已建立,可以进行通信。 2
  • 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket通信,要想做一个好的聊天室,我觉得大部分精力可能更应该花在用户的视觉层交互上。...
  • WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套接字连接,在WebSocket协议下...
  • 2. WebSocket与 Socket区别: 3. WebSocket与http区别: 4. Boost beast 5. b/s通信 6. c/s通信 7. 性能 1. Websocket简介 WebSocket用于在Web浏览器和服务器之间进行数据传输的一种技术。当然如果非要用它...
  • WebSocketSocket

    2020-06-22 12:34:54
    实现了浏览器服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。 目的:即时通讯,替代轮询 应用场景:网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力通常是...
  • 实现了浏览器服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。 ——百度百科 目的:即时通信,替代轮询   网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力...
  • 最近由于工程需要,需要在本地实现网页本地程序实时通信,但网页又不能直接通过socket与本地程序通信,只能支持相关的web协议,经过考虑我选择了http与websocket协议,这样的话就要实现本地服务器,网上有很多开源...
  • 实现了浏览器服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http 。 之前...
  • 一、说明1.1 背景说明前段时间同事说云平台通信使用了个...从应用场合上看,websocket可以使用javascript实现,而socket不能用javascript实现(真不能吗?我不太确实);从实际效果上看,websocket其实确实就像...
  • 发文原由:熟悉socket通信的同学,对于socket模拟server与client,实现相互通信,或者使用websocket与java模拟的websocket服务器通信(比如一个聊天室),对于这些都比较熟悉了。但是可能会有下面这种情况,java项目...
  • 为了解决HTML5(webSocket)...1.HTML5客户端到服务器端的通信:采用SuperSocket方案(上网搜索SuperSocket名称即可看到相关用法,这里不再多说); 2.CS(WPF)客户端到服务器端的通信:采用WebSocket4Net方案(目...
  • 随着互联网技术的不断发展,Web技术在各个领域...Socket.io类库实现了一个基于WebSocket协议的Web应用。经实验表明,所描述的研究能成功地在客户端和服务器端完成基于HTML5 WebSocket协议的实时通信过程并建立连接。
  • 基于socket包,简易websocket客户端服务端实现,可通过客户端发送消息至服务端,服务端接受消息。 python中socket、socketio、flask-socketio、WebSocket的区别联系—TCP/IP原理图 socket通信的基础,并不是一...
  • 12 WebSocket与 Socket区别:... 13 WebSocket与http区别:... 14 Boost beast. 25 b/s通信... 36 c/s通信... 67 性能... 81 Websocket简介WebSocket用于在Web浏览器和服务器之间进行数据传输的一种技术。当然如果...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 380
精华内容 152
关键字:

websocket与socket实现通信