自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(0)
  • 资源 (2)
  • 收藏
  • 关注

空空如也

简易聊天含服务端和客户端

简易聊天程序,含服务端和客户端代码,可以下载下来学习学习

2014-08-22

TCP通信实例

包含客户端和服务端监听程序,以下是代码片段,想学习的可以参考以下 /// <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) { //每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息 User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint)); AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count)); } else { break; } } } private void ReceiveData(object userState) { User user = (User)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) { AddItemToListBox(string.Format("与{0}失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint)); RemoveUser(user); } break; } AddItemToListBox(string.Format("来自[{0}]:{1}", user.client.Client.RemoteEndPoint, receiveString)); string[] splitString = receiveString.Split(','); switch (splitString[0]) { case "Login": user.userName = splitString[1]; AsyncSendToAllClient(user, receiveString); break; case "Logout": AsyncSendToAllClient(user, receiveString); RemoveUser(user); return; case "Talk": string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2); AddItemToListBox(string.Format("{0}对{1}说:{2}", user.userName, splitString[1], talkString)); foreach (User target in userList) { if (target.userName == splitString[1]) { AsyncSendToClient(target, "talk," + user.userName + "," + talkString); break; } } break; default: AddItemToListBox("什么意思啊:" + receiveString); break; } } } /// <summary> /// 异步发送信息给所有客户 /// </summary> /// <param name="user"></param> /// <param name="message"></param> private void AsyncSendToAllClient(User user, string message) { string command = message.Split(',')[0].ToLower(); if (command == "login") { for (int i = 0; i < userList.Count; i++) { AsyncSendToClient(userList[i], message); if (userList[i].userName != user.userName) AsyncSendToClient(user, "login," + userList[i].userName); } } else if (command == "logout") { for (int i = 0; i < userList.Count; i++) { if (userList[i].userName != user.userName) AsyncSendToClient(userList[i], message); } } } /// <summary> /// 异步发送message给user /// </summary> /// <param name="user"></param> /// <param name="message"></param> private void AsyncSendToClient(User 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); } private delegate void SendToClientDelegate(User user, string message); /// <summary> /// 发送message给user /// </summary> /// <param name="user"></param> /// <param name="message"></param> private void SendToClient(User user, string message) { try { //将字符串写入网络流,此方法会自动附加字符串长度前缀 user.bw.Write(message); user.bw.Flush(); AddItemToListBox(string.Format("向[{0}]发送:{1}", user.userName, message)); } catch { AddItemToListBox(string.Format("向[{0}]发送信息失败", user.userName)); } } /// <summary> /// 移除用户 /// </summary> /// <param name="user"></param> private void RemoveUser(User user) { userList.Remove(user); user.Close(); AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count)); } delegate void ReceiveMessageDelegate(User user, out string receiveMessage); /// <summary> /// 接收客户端发来的信息 /// </summary> /// <param name="user"></param> /// <param name="receiveMessage"></param> private void ReceiveMessage(User user, out string receiveMessage) { try { receiveMessage = user.br.ReadString(); } catch (Exception ex) { AddItemToListBox(ex.Message); receiveMessage = null; } } private delegate void ListenClientDelegate(out TcpClient client); /// <summary> /// 接受挂起的客户端连接请求 /// </summary> /// <param name="newClient"></param>

2014-08-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除