/// <summary>处理收到的数据</summary> /// <param name="pk"></param> /// <param name="remote"></param> protected override Boolean OnReceive(Packet pk, IPEndPoint remote) { // 过滤自己广播的环回数据。放在这里,兼容UdpSession if (!Loopback && remote.Port == Port) { if (!Local.Address.IsAny()) { if (remote.Address.Equals(Local.Address)) { return(false); } } else { foreach (var item in NetHelper.GetIPsWithCache()) { if (remote.Address.Equals(item)) { return(false); } } } } #if !__MOBILE__ // 更新全局远程IP地址 NewLife.Web.WebHelper.UserHost = remote?.Address + ""; #endif LastRemote = remote; StatReceive?.Increment(pk.Count); if (base.OnReceive(pk, remote)) { return(true); } // 分析处理 var e = new ReceivedEventArgs(pk) { UserState = remote }; // 为该连接单独创建一个会话,方便直接通信 var session = CreateSession(remote); // 数据直接转交给会话,不再经过事件,那样在会话较多时极为浪费资源 if (session is UdpSession us) { us.OnReceive(e); } else { // 没有匹配到任何会话时,才在这里显示日志。理论上不存在这个可能性 if (Log.Enable && LogReceive) { WriteLog("Recv [{0}]: {1}", e.Length, e.ToHex(32, null)); } } if (session != null) { RaiseReceive(session, e); } return(true); }
/// <summary>触发数据到达事件</summary> /// <param name="sender"></param> /// <param name="e"></param> protected virtual void RaiseReceive(Object sender, ReceivedEventArgs e) { LastTime = DateTime.Now; if (StatReceive != null) StatReceive.Increment(e.Length); if (Received != null) Received(sender, e); }
/// <summary>触发数据到达事件</summary> /// <param name="sender"></param> /// <param name="e">接收事件参数</param> protected virtual void RaiseReceive(Object sender, ReceivedEventArgs e) => Received?.Invoke(sender, e);
/// <summary>处理收到的数据</summary> /// <param name="data"></param> /// <param name="remote"></param> internal override void OnReceive(Byte[] data, IPEndPoint remote) { // 过滤自己广播的环回数据。放在这里,兼容UdpSession if (!Loopback && remote.Port == Port) { if (!Local.Address.IsAny()) { if (remote.Address.Equals(Local.Address)) return; } else { foreach (var item in NetHelper.GetIPsWithCache()) { if (remote.Address.Equals(item)) return; } } } #if !Android // 更新全局远程IP地址 NewLife.Web.WebHelper.UserHost = remote.ToString(); #endif // 分析处理 var e = new ReceivedEventArgs(); e.Data = data; e.UserState = remote; // 为该连接单独创建一个会话,方便直接通信 var session = CreateSession(remote); // 数据直接转交给会话,不再经过事件,那样在会话较多时极为浪费资源 var us = session as UdpSession; if (us != null) us.OnReceive(e); else { // 没有匹配到任何会话时,才在这里显示日志。理论上不存在这个可能性 if (Log.Enable && LogReceive) WriteLog("Recv [{0}]: {1}", e.Length, e.Data.ToHex(0, Math.Min(e.Length, 32))); } if (session != null) RaiseReceive(session, e); }
/// <summary>处理收到的数据。默认匹配同步接收委托</summary> /// <param name="e">接收事件参数</param> /// <returns>是否已处理,已处理的数据不再向下传递</returns> protected abstract Boolean OnReceive(ReceivedEventArgs e);
void OnReceived(Object sender, ReceivedEventArgs e) { var data = e.Data; if (data == null || data.Length < 1) return; BytesOfReceived += data.Length; // 处理数据委托 if (Received != null) { var e2 = new BufferEventArgs { Value = data }; Received(this, e2); if (!e2.Cancel) return; // 外部可能修改了数据 data = e2.Value; //if (!BufferEventArgs.Invoke(Received, data)) return null; } // 处理字符串委托 if (ReceivedString == null) return; var cfg = SerialPortConfig.Current; var line = ""; if (cfg.HexShow) { if (data.Length > 32) line = "[{0}]=\r\n{1}".F(data.Length, data.ToHex("-", 32)); else line = "[{0}]={1}".F(data.Length, data.ToHex("-", 32)); if (cfg.HexNewLine) line += Environment.NewLine; } else { line = cfg.Encoding.GetString(data); if (_stream == null) _stream = new MemoryStream(); else if (_stream.Length > 10 * 1024 && _stream.Position == _stream.Length) // 达到最大大小时,从头开始使用 _stream = new MemoryStream(); _stream.Write(data); _stream.Seek(-1 * data.Length, SeekOrigin.Current); if (_reader == null || _reader.BaseStream != _stream || _reader.CurrentEncoding != cfg.Encoding) _reader = new StreamReader(_stream, cfg.Encoding); line = _reader.ReadToEnd(); } if (ReceivedString != null) ReceivedString(this, new StringEventArgs { Value = line }); }
/// <summary>收到数据时触发</summary> /// <param name="buf"></param> protected virtual void OnReceive(Byte[] buf) { if (Received != null) { var e = new ReceivedEventArgs(buf); Received(this, e); //// 数据发回去 //if (e.Feedback) Serial.Write(buf, 0, buf.Length); } }
/// <summary>处理收到的数据</summary> /// <param name="data"></param> /// <param name="count"></param> protected virtual void OnReceive(Byte[] data, Int32 count) { #if !Android // 更新全局远程IP地址 NewLife.Web.WebHelper.UserHost = Remote.EndPoint.ToString(); #endif // 分析处理 var e = new ReceivedEventArgs(); e.Data = data; e.Length = count; e.UserState = Remote.EndPoint; if (Log.Enable && LogReceive) WriteLog("Recv [{0}]: {1}", e.Length, e.Data.ToHex(0, Math.Min(e.Length, 32))); RaiseReceive(this, e); }
internal void OnReceive(ReceivedEventArgs e) { LastTime = DateTime.Now; //if (StatReceive != null) StatReceive.Increment(e.Length); if (Log.Enable && LogReceive) WriteLog("Recv [{0}]: {1}", e.Length, e.Data.ToHex(0, Math.Min(e.Length, 32))); if (Received != null) Received(this, e); }