예제 #1
0
            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);
                        }
                    }
                }
            }
예제 #2
0
        /// <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
                    }
                }
            }
        }