/// <summary> /// 异步接受服务器端的数据后的后的函数 /// </summary> /// <param name="ar">异步操作状态</param> private void ReceiveCallback(IAsyncResult ar) { // 从输入参数异步state对象中获取state和socket对象 StateObject state = (StateObject)ar.AsyncState; Socket client = state.WorkSocket; try { m_mutex.WaitOne(); //从远程设备读取数据 int bytes = client.EndReceive(ar); if (bytes > 0) { // 有数据,存储 state.Save(bytes); if (bytes < StateObject.BufferSize || (state.Buffer[bytes - 1] == StateObject.END[1] && state.Buffer[bytes - 2] == StateObject.END[0])) { //接收完成 if (OnReceive != null) { byte[] validData = new byte[state.FullData.Length - 2]; Array.Copy(state.FullData, validData, validData.Length); CommEventArgs commArgs = DeserializeObject(validData) as CommEventArgs; state.ClearData(); if (commArgs != null) { OnReceive(this, commArgs); } } }// if // 继续读取 client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } else { TriggerConnectedEvent(false); Dispose(); } } catch (Exception err) { TriggerConnectedEvent(false); Dispose(); Console.WriteLine("{0},方法ReceiveCallback,异常:{1}", this.GetType().Name, err.Message); } finally { m_mutex.ReleaseMutex(); } }
/// <summary> /// 发送数据到连接好的网络设备 /// </summary> /// <param name="args">要发送的数据</param> public void Send(CommEventArgs args) { try { if (IsConnection) { byte[] buffer = SerializeObject(args); byte[] frame = new byte[buffer.Length + 2]; Array.Copy(buffer, frame, buffer.Length); frame[frame.Length - 2] = StateObject.END[0]; frame[frame.Length - 1] = StateObject.END[1]; clientSocket.BeginSend(frame, 0, frame.Length, SocketFlags.None, new AsyncCallback(OnSend), null); } } catch (Exception err) { TriggerConnectedEvent(false); Console.WriteLine("{0},方法Send,异常:{1}", this.GetType().Name, err.Message); } }
/// <summary> /// 发送消息 /// </summary> /// <param name="args">发送内容</param> /// <param name="error">出错时返回错误信息,无错时返回null</param> /// <returns>成功返回true, 失败返回false</returns> public bool Send(CommEventArgs args, out string error) { try { if (m_dicClient.ContainsKey(args.Id)) { byte[] buffer = SerializeObject(args); byte[] frame = new byte[buffer.Length + 2]; Array.Copy(buffer, frame, buffer.Length); frame[frame.Length - 2] = StateObject.END[0]; frame[frame.Length - 1] = StateObject.END[1]; m_dicClient[args.Id].Send(frame); } error = null; return(true); } catch (Exception err) { if (m_dicClient.ContainsKey(args.Id)) { TriggerConnectedEvent(m_dicClient[args.Id], false); } error = err.Message; //MessageBox.Show(err.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); Console.WriteLine("{0},方法Close,异常:{1}", this.GetType().Name, err.Message); return(false); } finally { m_dicClient.Remove(args.Id); } }
/// <summary> /// 读取缓冲区数据 /// </summary> /// <param name="ar">socket</param> public void ReadCallback(IAsyncResult ar) { Socket client = null; StateObject state = null; try { m_mutex.WaitOne(); state = ar.AsyncState as StateObject; client = state.WorkSocket; int bytes = client.EndReceive(ar); if (bytes > 0) { state.Save(bytes); TriggerConnectedEvent(client, true); if (bytes < StateObject.BufferSize || (state.Buffer[bytes - 1] == StateObject.END[1] && state.Buffer[bytes - 2] == StateObject.END[0])) { //接收完成 if (OnReceive != null) { byte[] validData = new byte[state.FullData.Length - 2]; Array.Copy(state.FullData, validData, validData.Length); CommEventArgs commArgs = DeserializeObject(validData) as CommEventArgs; state.ClearData(); if (commArgs != null) { m_dicClient.Add(commArgs.Id, client); OnReceive(this, commArgs); } } }// if client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } else { TriggerConnectedEvent(client, false); } } catch (SocketException socketError) { TriggerConnectedEvent(client, false); Console.WriteLine("{0},方法ReadCallback,异常:{1} {2}", this.GetType().Name, socketError.ErrorCode, socketError.Message); } catch (Exception err) { Console.WriteLine("{0},方法ReadCallback,异常:{1}", this.GetType().Name, err.Message); state.ClearData(); client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); //if (err.Message == "在分析完成之前就遇到流结尾。") //{ // state.ClearData(); // client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); //} //else //{ // TriggerConnectedEvent(client, false); // Console.WriteLine("{0},方法ReadCallback,异常:{1}", this.GetType().Name, err.Message); //} } finally { m_mutex.ReleaseMutex(); } }