private void ReceiveData(object userState) { TcpUser user = (TcpUser)userState; TcpClient client = user.client; while (!isExit) { string receiveString = null; ReceiveMessageDelegate d = new ReceiveMessageDelegate(ReceiveMessage); IAsyncResult result = d.BeginInvoke(user, out receiveString, null, null); //使用轮询方式来判断异步操作是否完成 while (!result.IsCompleted) { if (isExit) { break; } Thread.Sleep(250); } //获取Begin方法的返回值和所有输入/输出参数 d.EndInvoke(out receiveString, result); if (receiveString == null) { if (!isExit) { RemoveUser(user); } break; } AsyncSendToClient(user, receiveString); } }
/// <summary> /// 监听客户端请求 /// </summary> private void ListenClientConnect() { TcpClient newClient = null; while (true) { ListenClientDelegate d = new ListenClientDelegate(ListenClient); IAsyncResult result = d.BeginInvoke(out newClient, null, null); //使用轮询方式来判断异步操作是否完成 while (result.IsCompleted == false) { if (isExit) { break; } Thread.Sleep(250); } //获取Begin 方法的返回值和所有输入/输出参数 d.EndInvoke(out newClient, result); if (newClient != null) { //每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息 TcpUser user = new TcpUser(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); } else { break; } } }
/// <summary> /// 接收客户端发来的信息 /// </summary> /// <param name="user"></param> /// <param name="receiveMessage"></param> private void ReceiveMessage(TcpUser user, out string receiveMessage) { try { receiveMessage = user.br.ReadString(); } catch (Exception ex) { receiveMessage = null; } }
/// <summary> /// 发送message给user /// </summary> /// <param name="user"></param> /// <param name="message"></param> private bool SendToClient(TcpUser user, string message) { try { //将字符串写入网络流,此方法会自动附加字符串长度前缀 user.bw.Write(message); user.bw.Flush(); return(true); } catch { return(false); } }
/// <summary> /// 异步发送message给user /// </summary> /// <param name="user"></param> /// <param name="message"></param> private void AsyncSendToClient(TcpUser user, string message) { SendToClientDelegate d = new SendToClientDelegate(SendToClient); IAsyncResult result = d.BeginInvoke(user, message, null, null); while (result.IsCompleted == false) { if (isExit) { break; } Thread.Sleep(250); } d.EndInvoke(result); }
/// <summary> /// 移除用户 /// </summary> /// <param name="user"></param> private void RemoveUser(TcpUser user) { userList.Remove(user); user.Close(); }