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; } } }
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(); }
/* * 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(); } }