コード例 #1
0
        private void Ws_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            string data = e.Message;

            this.serverActivity = DateTime.Now;
            if (data == Frame.LF.ToString())
            {
                this.Debug("<<< PONG");
                return;
            }
            this.Debug("<<< " + data);

            var unmarshalledData = Frame.Unmarshall(this.partialData + data);

            this.partialData = unmarshalledData.Partial;
            var frames = unmarshalledData.Frames;

            for (int _i = 0, _len = frames.Count; _i < _len; _i++)
            {
                var frame = frames[_i];
                switch (frame.Command)
                {
                case CommandEnum.CONNECTED:
                    this.Status = StompStatus.Connected;
                    this.Debug("connected to server " + frame.GetHeader("server"));
                    this.SetupHeartbeat(frame.Headers);
                    Callbacks.ConnectSuccess?.Invoke(frame);
                    break;

                case CommandEnum.MESSAGE:
                    var subscription = frame.GetHeader("subscription");
                    var onreceive    = this.GetSubscribeCallback(subscription);
                    if (onreceive != null)
                    {
                        var messageID = frame.GetHeader("message-id");
                        onreceive.Invoke(frame);
                    }
                    else
                    {
                        this.Debug("Unhandled received MESSAGE: " + frame);
                    }
                    break;

                //case CommandEnum.RECEIPT:
                //    this.onreceipt?.Invoke(frame)
                //    break;
                case CommandEnum.ERROR:
                    Callbacks.Error?.Invoke(frame);
                    break;

                default:
                    this.Debug("Unhandled frame: " + frame);
                    break;
                }
            }
        }
コード例 #2
0
        private void Ws_Closed(object sender, ClosedEventArgs e)
        {
            string code   = "";
            string reason = "";

            if (e != null)
            {
                System.Net.WebSockets.WebSocketCloseStatus closeStatus = (System.Net.WebSockets.WebSocketCloseStatus)e.Code;
                code   = e.Code + "(" + closeStatus.ToString() + ")";
                reason = e.Reason;
            }
            this.Status = StompStatus.Disconnected;
            Callbacks.Disconnected?.Invoke();
            this.Debug($"Whoops! WebSocket Closed: {code} {reason}");
            this.CleanUp();
        }
コード例 #3
0
        /*
         * Client.prototype._setupHeartbeat = function (headers) {
         *  var serverIncoming, serverOutgoing, ttl, v, _ref, _ref1;
         *  if ((_ref = headers.version) !== Stomp.VERSIONS.V1_1 && _ref !== Stomp.VERSIONS.V1_2) {
         *      return;
         *  }
         *  _ref1 = (function () {
         *      var _i, _len, _ref1, _results;
         *      _ref1 = headers['heart-beat'].split(",");
         *      _results = [];
         *      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
         *          v = _ref1[_i];
         *          _results.push(parseInt(v));
         *      }
         *      return _results;
         *  })(), serverOutgoing = _ref1[0], serverIncoming = _ref1[1];
         *  if (!(this.heartbeat.outgoing === 0 || serverIncoming === 0)) {
         *      ttl = Math.max(this.heartbeat.outgoing, serverIncoming);
         *      if (typeof this.debug === "function") {
         *          this.debug("send PING every " + ttl + "ms");
         *      }
         *      this.pinger = Stomp.setInterval(ttl, (function (_this) {
         *          return function () {
         *              _this.ws.send(Byte.LF);
         *              return typeof _this.debug === "function" ? _this.debug(">>> PING") : void 0;
         *          };
         *      })(this));
         *  }
         *  if (!(this.heartbeat.incoming === 0 || serverOutgoing === 0)) {
         *      ttl = Math.max(this.heartbeat.incoming, serverOutgoing);
         *      if (typeof this.debug === "function") {
         *          this.debug("check PONG every " + ttl + "ms");
         *      }
         *      return this.ponger = Stomp.setInterval(ttl, (function (_this) {
         *          return function () {
         *              var delta;
         *              delta = now() - _this.serverActivity;
         *              if (delta > ttl * 2) {
         *                  if (typeof _this.debug === "function") {
         *                      _this.debug("did not receive server activity for the last " + delta + "ms");
         *                  }
         *                  return _this.ws.close();
         *              }
         *          };
         *      })(this));
         *  }
         * };
         */
        public void Connect(StompHeader headers, Action <Frame> connectCallback, Action <Frame> failedCallback = null)
        {
            Callbacks.ConnectSuccess = connectCallback;
            Callbacks.Error          = failedCallback;
            this.SockJs.OnError     += (sender, args) => { Console.WriteLine(args.Exception.Message); };

            if (this.SockJs.State == WebSocketState.Open)
            {
                connectCallback(new Frame());
            }
            else
            {//先要将WebSocket打开,才能发送Stomp连接命令
                this.Status = StompStatus.Connecting;
                this.Debug("Opening Web Socket for stomp connect...");
                this.SockJs.Open();
            }
        }