public void OnRecieve(HostRecieveEventArgs e) { // 此demo进行了一次简单的定长数据获取示例 ClientHostRecieveEventArgs args = (ClientHostRecieveEventArgs)e; if (args.Client.DataMode) { // 数据模式 args.ResultData = _sign + e.Content; args.Result = HostEventResults.Finished; } else { // 命令模式 // 此处以+开头定义成功的数据 // 此处以-开头定义失败的数据 if (e.Content.StartsWith("+") || e.Content.StartsWith("-")) { _sign = e.Content.Substring(0, 1); // 获取内容长度 int len = int.Parse(e.Content.Substring(1)); // 当长度为0时直接返回,否则设置数据模式 if (len <= 0) { args.ResultData = _sign; args.Result = HostEventResults.Finished; } else { args.Client.SetDataMode(len); } } } }
/// <summary> /// 发送数据 /// </summary> /// <param name="bytes">待发送的字节数组</param> /// <param name="callback">回调函数</param> public void Send(byte[] bytes, SendCallback callback = null) { // 发送信息 _stream.Write(bytes, 0, bytes.Length); _stream.Flush(); // 当设置了回调后,开始等待接收数据 if (callback != null) { // 结束和超时标志 bool isEnd = false; // 设置回车标志 bool r = false; // 设置字节列表 _command = new List <byte>(); // 设置当未满足结束和未超时时进行循环 while (!isEnd) { // 根据当前模式读取数据 if (this.DataMode) { #region [=====数据模式=====] // 根据缓存大小读取数据 int len = _stream.Read(_buffer, _offset, _buffer.Length - _offset); // 增加数据偏移 _offset += len; // 判断数据是否读取完毕,如已读取完毕,则开始处理业务 if (_offset >= _buffer.Length) { // 获取数据字符串 string data = System.Text.Encoding.UTF8.GetString(_buffer); // 执行业务调用 using (ClientHostRecieveEventArgs e = new ClientHostRecieveEventArgs()) { e.Client = this; e.Content = data; //执行宿主事件 _host.OnRecieve(e); if (e.Result == HostEventResults.Finished) { // 设置回调 callback(e.ResultData); // 设置结束标志 isEnd = true; } } // 设置为命令模式 SetCommandMode(); } #endregion } else { #region [=====命令模式=====] //命令模式,判断换行标志提取命令 // 读取一个字节 int bs = _stream.ReadByte(); if (bs >= 0) { // 读入正常数据后进行数据解析 switch (bs) { case 13: //回车(\r) // 出现两个连续的回车标志则视为非常规 if (r) { //调试输出错误信息 Debug.WriteLine("-> Error:规则外的回车符"); } r = true; break; case 10: //换行(\n) if (r) { //获取行命令并重置回车标志 string cmd = System.Text.Encoding.UTF8.GetString(_command.ToArray()); r = false; //执行业务调用 using (ClientHostRecieveEventArgs e = new ClientHostRecieveEventArgs()) { e.Client = this; e.Content = cmd; //执行宿主事件 _host.OnRecieve(e); if (e.Result == HostEventResults.Finished) { // 设置回调 callback(e.ResultData); // 设置结束标志 isEnd = true; } } } else { //调试输出错误信息 Debug.WriteLine("-> Error:规则外的换行符"); } // 清除命令字节列表 _command.Clear(); break; default: // 正常情况下,不应该在此处出现回车标志 if (r) { //调试输出错误信息 Debug.WriteLine("-> Error:规则外的换行符"); // 清除命令字节列表并重置回车标志 _command.Clear(); r = false; } // 将命令字符加入命令字节列表中 _command.Add((byte)bs); break; } } else { // 未读取数据,则线程等待毫秒,防止线程阻塞 System.Threading.Thread.Sleep(10); } #endregion } } } }