在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → html5 websoket实现多设备之间实时通讯

html5 websoket实现多设备之间实时通讯

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:3.59M
  • 下载次数:70
  • 浏览次数:686
  • 发布时间:2016-01-27
  • 实例类别:C#语言基础
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: HTML5 通讯 HTML web

实例介绍

【实例简介】

【实例截图】

【核心代码】

客户端源码:

(function (global, factory) {
    if (typeof define === 'function' && define.amd) {
        define([], factory);
    } else if (typeof module !== 'undefined' && module.exports){
        module.exports = factory();
    } else {
        global.PsWebSocket = factory();
    }
})(this, function () {

    if (!('WebSocket' in window)) {
        return;
    }

    function PsWebSocket(url, options) {

        // 默认设置
        var settings = {

            /** 是否记录调试信息. */
            debug: false,

            /** 是否在创建时自动连接 */
            automaticOpen: true,

            /** 自动重连等待时间. */
            reconnectInterval: 1000,
            /** 自动重连最长等待时间. */
            maxReconnectInterval: 30000,
            /** 自动重连增加的速度 */
            reconnectDecay: 1.5, 
            /** 等待连接的最长等待时间. */
            timeoutInterval: 2000,

            /** 重新连接的最大次数,为空则不限制 */
            maxReconnectAttempts: null
        }
        if (!options) { options = {}; } 
        
        for (var key in settings) {
            if (typeof options[key] !== 'undefined') {
                this[key] = options[key];
            } else {
                this[key] = settings[key];
            }
        }
        /** websocket地址,绝对地址,只读 */
        this.url = url;
        /** 重新连接次数,或最后一次成功 只读 */
        this.reconnectAttempts = 0;

        /**
         * 连接状态
         * 可能的值: WebSocket.CONNECTING, WebSocket.OPEN, WebSocket.CLOSING, WebSocket.CLOSED
         * 只读
         */
        this.readyState = WebSocket.CONNECTING;
 

        var self = this;
        var ws;
        var forcedClose = false;
        var timedOut = false;
        var eventTarget = document.createElement('div'); 
        eventTarget.addEventListener('open',       function(event) { self.onopen(event); });
        eventTarget.addEventListener('close',      function(event) { self.onclose(event); });
        eventTarget.addEventListener('connecting', function(event) { self.onconnecting(event); });
        eventTarget.addEventListener('message',    function(event) { self.onmessage(event); });
        eventTarget.addEventListener('error',      function(event) { self.onerror(event); });

 

        this.addEventListener = eventTarget.addEventListener.bind(eventTarget);
        this.removeEventListener = eventTarget.removeEventListener.bind(eventTarget);
        this.dispatchEvent = eventTarget.dispatchEvent.bind(eventTarget);

        /**
         * 兼容IE9-IE11 
         */
        function generateEvent(s, args) {
        	var evt = document.createEvent("CustomEvent");
        	evt.initCustomEvent(s, false, false, args);
        	return evt;
        };

        /**
         * 打开连接 
         */
        this.open = function (reconnectAttempt) {
            ws = new WebSocket(self.url);

            if (reconnectAttempt) {
                if (this.maxReconnectAttempts && this.reconnectAttempts > this.maxReconnectAttempts) {
                    return;
                }
            } else {
                eventTarget.dispatchEvent(generateEvent('connecting'));
                this.reconnectAttempts = 0;
            }

            if (self.debug || PsWebSocket.debugAll) {
                console.debug('PsWebSocket', 'attempt-connect', self.url);
            }

            var localWs = ws;
            var timeout = setTimeout(function() {
                if (self.debug || PsWebSocket.debugAll) {
                    console.debug('PsWebSocket', 'connection-timeout', self.url);
                }
                timedOut = true;
                localWs.close();
                timedOut = false;
            }, self.timeoutInterval);

            ws.onopen = function(event) {
                clearTimeout(timeout);
                if (self.debug || PsWebSocket.debugAll) {
                    console.debug('PsWebSocket', 'onopen', self.url);
                }
                self.protocol = ws.protocol;
                self.readyState = WebSocket.OPEN;
                self.reconnectAttempts = 0;
                var e = generateEvent('open');
                e.isReconnect = reconnectAttempt;
                reconnectAttempt = false;
                eventTarget.dispatchEvent(e);
            };

            ws.onclose = function(event) {
                clearTimeout(timeout);
                ws = null;
                if (forcedClose) {
                    self.readyState = WebSocket.CLOSED;
                    eventTarget.dispatchEvent(generateEvent('close'));
                } else {
                    self.readyState = WebSocket.CONNECTING;
                    var e = generateEvent('connecting');
                    e.code = event.code;
                    e.reason = event.reason;
                    e.wasClean = event.wasClean;
                    eventTarget.dispatchEvent(e);
                    if (!reconnectAttempt && !timedOut) {
                        if (self.debug || PsWebSocket.debugAll) {
                            console.debug('PsWebSocket', 'onclose', self.url);
                        }
                        eventTarget.dispatchEvent(generateEvent('close'));
                    }

                    var timeout = self.reconnectInterval * Math.pow(self.reconnectDecay, self.reconnectAttempts);
                    setTimeout(function() {
                        self.reconnectAttempts  ;
                        self.open(true);
                    }, timeout > self.maxReconnectInterval ? self.maxReconnectInterval : timeout);
                }
            };
            ws.onmessage = function(event) {
                if (self.debug || PsWebSocket.debugAll) {
                    console.debug('PsWebSocket', 'onmessage', self.url, event.data);
                }
                var e = generateEvent('message');
				var  eobj = eval('('   event.data   ')');
				e.ResultCode=eobj.ResultCode;
				e.DeviceID=eobj.DeviceID;
				e.ErrorMsg=eobj.ErrorMsg;
				e.Command=eobj.Command;
                e.data = eobj.ResultData;
                eventTarget.dispatchEvent(e);
            };
            ws.onerror = function(event) {
                if (self.debug || PsWebSocket.debugAll) {
                    console.debug('PsWebSocket', 'onerror', self.url, event);
                }
                eventTarget.dispatchEvent(generateEvent('error'));
            };
        } 
        if (this.automaticOpen == true) {
            this.open(false);
        }

        /**
         * 发送消息. 
         */
        this.send = function(data) {
            if (ws) {
                if (self.debug || PsWebSocket.debugAll) {
                    console.debug('PsWebSocket', 'send', self.url, data);
                }
                return ws.send(data);
            } else {
                throw '状态错误:websocket未连接';
            }
        };

        /**
         * 关闭连接 
         */
        this.close = function(code, reason) {
            // Default CLOSE_NORMAL code
            if (typeof code == 'undefined') {
                code = 1000;
            }
            forcedClose = true;
            if (ws) {
                ws.close(code, reason);
            }
        };

        /**
         * 刷新 
         */
        this.refresh = function() {
            if (ws) {
                ws.close();
            }
        };
    }

    //连接websocket后触发
    PsWebSocket.prototype.onopen = function(event) {};
    //关闭websocket后触发
    PsWebSocket.prototype.onclose = function(event) {};
    //尝试连接时触发
    PsWebSocket.prototype.onconnecting = function(event) {};
     //收到消息后触发
    PsWebSocket.prototype.onmessage = function(event) {};
     //产生错误后触发
    PsWebSocket.prototype.onerror = function(event) {};

   

    PsWebSocket.debugAll = false;

    PsWebSocket.CONNECTING = WebSocket.CONNECTING;
    PsWebSocket.OPEN = WebSocket.OPEN;
    PsWebSocket.CLOSING = WebSocket.CLOSING;
    PsWebSocket.CLOSED = WebSocket.CLOSED;

    return PsWebSocket;
});

服务端源码:

using System;
using System.Collections.Generic;
using System.ServiceProcess;
using Castle.MicroKernel;
using Castle.Windsor;
using PengeSoft.Common;
using PengeSoft.Device;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Logging;
using SuperWebSocket;

namespace PsDevService
{
    public partial class Service1 : ServiceBase
    {
        #region 私有字段

        protected static readonly PengeSoft.Logging.ILog _logger = PengeSoft.Logging.LogManager.GetLogger("WebSocket Service");
        private WebSocketServer m_WebSocketServer;
        private List<IDeviceService> devicelist;//设备列表
        private IWindsorContainer _container;

        #endregion

        #region 构造函数

        public Service1()
        {
            InitializeComponent();
        }

        #endregion

        #region 重写ServiceBase

        protected override void OnStart(string[] args)
        {
            string value = System.Configuration.ConfigurationManager.AppSettings["Port"];
            int port = SysUtils.ToInt(value);
            if (port <= 0)
                port = 2012;

            m_WebSocketServer = new WebSocketServer();
            var rootConfig = new RootConfig { DisablePerformanceDataCollector = true };

            m_WebSocketServer.NewDataReceived  = m_WebSocketServer_NewDataReceived;
            m_WebSocketServer.NewMessageReceived  = m_WebSocketServer_NewMessageReceived;
            m_WebSocketServer.NewSessionConnected  = m_WebSocketServer_NewSessionConnected;
            m_WebSocketServer.SessionClosed  = m_WebSocketServer_SessionClosed;

            var config = new ServerConfig();
            config.Port = port;
            config.Ip = "Any";
            config.MaxConnectionNumber = 100;
            config.MaxRequestLength = 100000;
            config.Name = "WebSocket Proxy Server";
            var ret = m_WebSocketServer.Setup(rootConfig, config, null, null, new ConsoleLogFactory(), null, null);
            m_WebSocketServer.Start();

            _container = ComponentManager.GetInstance();
            IHandler[] handlers = _container.Kernel.GetHandlers(typeof(IDeviceService));
            devicelist = new List<IDeviceService>();
            IDeviceService deviceservice;
            foreach (IHandler handler in handlers)
            {
                deviceservice = (IDeviceService)_container[handler.ComponentModel.Name];
                deviceservice.webSocketServer = m_WebSocketServer;
                devicelist.Add(deviceservice);
            }

            _logger.Info(string.Format("启动成功,port={0}", port));
        }

        protected override void OnStop()
        {
            m_WebSocketServer.Stop();
            _logger.Info("服务停止");
        }

        #endregion

        #region WebSocketServer 事件

        void m_WebSocketServer_SessionClosed(WebSocketSession session, CloseReason value)
        {
        }

        void m_WebSocketServer_NewSessionConnected(WebSocketSession session)
        {
        }

        void m_WebSocketServer_NewDataReceived(WebSocketSession session, byte[] value)
        {
        }

        /// <summary>
        /// 收到消息触发事件
        /// </summary>
        /// <param name="session"></param>
        /// <param name="value"></param>
        void m_WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
        {
            try
            {
                _logger.Debug(string.Format("收到消息,消息内容={0}", value));
                string pars = value;
                string cmd = GetCommand(ref pars); 
                foreach (IDeviceService item in devicelist)
                {
                    if (cmd.StartsWith(item.ID   "_", StringComparison.OrdinalIgnoreCase))
                    {
                        cmd = cmd.Substring(item.ID.Length   1, cmd.Length - item.ID.Length - 1);
                        WebSocketResult result = item.TransCmd(session, cmd, pars);
                        session.Send(result.JsonText);
                        _logger.Debug(string.Format("对消息处理完成,消息内容={0}", value));
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                WebSocketResult result = new WebSocketResult();
                result.ResultCode = -1;
                result.DeviceID = "";
                result.ResultData = "";
                result.Command = value;
                result.ErrorMsg = e.Message;
                session.Send(result.JsonText);
                _logger.Error(string.Format("消息处理时产生异常,异常信息={0}", e.Message));
            }
        }

        #endregion

        #region 私有函数

        /// <summary>
        /// 取出参数
        /// </summary>
        /// <param name="pars"></param>
        /// <returns></returns>
        private string GetCommand(ref string pars)
        {
            int n = pars.IndexOf(' ');
            string cmd;
            if (n >= 0)
            {
                cmd = pars.Substring(0, n).Trim().ToUpper();
                pars = pars.Substring(n   1);
            }
            else
            {
                cmd = pars;
                pars = string.Empty;
            }

            return cmd.ToUpper();
        }

        #endregion

    }
}

标签: HTML5 通讯 HTML web

实例下载地址

html5 websoket实现多设备之间实时通讯

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警