/// <summary> /// 异步接收回调函数 /// </summary> /// <param name="ir"></param> private void EndReader(IAsyncResult ir) { SocketUserToken ir_UserToken = ir.AsyncState as SocketUserToken; try { if (ir_UserToken.m_nStream != null) { if (m_tcpClient == null) { ir_UserToken.m_nStream.Close(); ir_UserToken.m_nStream.Dispose(); return; } ir_UserToken.Offset = ir_UserToken.m_nStream.EndRead(ir); byte[] buffer = new byte[ir_UserToken.Offset]; Array.Copy(ir_UserToken.ReceiveBuffer.Buffer, buffer, ir_UserToken.Offset); string tmpStr = Encoding.UTF8.GetString(buffer, 0, ir_UserToken.Offset); if (!m_InDataParser.DecodeProtocolText(tmpStr)) //组装成功则进入 { ir_UserToken.ReceiveBuffer.Clear(ir_UserToken.Offset); //接收完成后清除掉前面的缓存 //组装接收的协议 // DelegateState.ServerStateInfo("信息" + Encoding.UTF8.GetString(buffer));//处理信息 } UserToken.m_nStream.BeginRead(UserToken.ReceiveBuffer.Buffer, 0, UserToken.ReceiveBuffer.Buffer.Length, new AsyncCallback(EndReader), UserToken); } } catch (Exception ex) { DelegateState.ServerStateInfo("接收异常:" + ex.Message); } }
/// <summary> /// 连接服务器 /// </summary> /// <param name="host">IP</param> /// <param name="port">地址</param> public void Connect(string Serverip, int Port) { m_outDataParser = new AssemblyOutDataParser(); m_InDataParser = new AssemblyInDataParser(); m_tcpClient = new TcpClient(); m_tcpClient.Client.Blocking = true; m_tcpClient.Client.Bind(new IPEndPoint(IPAddress.Parse(Serverip), Port)); m_tcpClient.Connect(Serverip, Port); m_tcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); NetworkStream nStream = new NetworkStream(m_tcpClient.Client, true); UserToken = new SocketUserToken(Serverip, Port, m_tcpClient, nStream); UserToken.m_nStream.BeginRead(UserToken.ReceiveBuffer.Buffer, 0, UserToken.ReceiveBuffer.Buffer.Length, new AsyncCallback(EndReader), UserToken); }