C#Socket通信实现多人联机和群发消息

1.服务器代码(这个服务器每次接受消息后就会遍历连接的客户端,将消息发给其他所有的客户端)

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;public class Server
{private static List<Socket> clientSockets = new List<Socket>();private static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);public static void Main(){Console.WriteLine("服务器已启动...");serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8000));serverSocket.Listen(10);while (true){Socket clientSocket = serverSocket.Accept();clientSockets.Add(clientSocket);Thread clientThread = new Thread(() =>{HandleClient(clientSocket);});clientThread.Start();}}private static void HandleClient(Socket clientSocket){//string reply = "你个憨憨,你已经成功连接";// byte[] data = Encoding.UTF8.GetBytes(reply);//clientSocket.Send(data);int clientId = clientSockets.IndexOf(clientSocket);while (true){byte[] buffer = new byte[1024];int bytesRead = clientSocket.Receive(buffer);if (bytesRead == 0){clientSockets.Remove(clientSocket);break;}string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine($"收到来自客户端{clientId}的消息:{message}");for (int i = 0; i < clientSockets.Count; i++){if (i != clientId){string replyMessage = $"来自客户端{clientId}的消息:{message}";byte[] replyData = Encoding.UTF8.GetBytes(replyMessage);clientSockets[i].Send(replyData);}}}clientSocket.Close();}
}

2.客户端代码 (客户端运用了多线程可以发送消息和接收消息可以同时进行,之前的版本只能在发送消息后才能接收消息)

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;class Program
{private static bool isRunning = true;private static TcpClient mySocket;static async Task Main(string[] args){mySocket = new TcpClient();await mySocket.ConnectAsync("127.0.0.1",8000); // 替换成实际的远程主机地址和端口号Task receiveTask = Task.Run(ReceiveData); // 启动一个任务用于接收数据Task sendTask = Task.Run(SendData); // 启动一个任务用于发送数据await Task.WhenAll(receiveTask, sendTask); // 等待所有任务完成mySocket.Close();Console.WriteLine("程序已退出");}static void ReceiveData(){using NetworkStream networkStream = mySocket.GetStream();while (isRunning){byte[] receiveBuffer = new byte[1024];int receiveLength = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length);string receivedData = Encoding.UTF8.GetString(receiveBuffer, 0, receiveLength);Console.WriteLine(receivedData);// 可以在此处进行接收数据后的其他操作}}static void SendData(){using NetworkStream networkStream = mySocket.GetStream();using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();while (isRunning){//Console.WriteLine("请输入您要发送的消息:");string sendstr = Console.ReadLine();//Console.Write("老朱佩奇1号机:"+"sendstr");byte[] sendBytes = Encoding.UTF8.GetBytes(sendstr);networkStream.Write(sendBytes, 0, sendBytes.Length);networkStream.Flush();// 可以在此处进行发送数据后的其他操作if (sendstr == "exit"){isRunning = false;cancellationTokenSource.Cancel();}}}
}

3.先运行服务器然后再开2个客户端就能实现群发消息了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/614894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【P2P】

文章目录 P2P应用纯P2P架构文件分发&#xff1a;C/S vs P2P文件分发时间&#xff1a;C/S模式文件分发时间&#xff1a;P2P模式 P2P文件分发&#xff1a;BitTorrentP2P文件分发&#xff1a;BitTorrentBitTorrent&#xff1a;请求&#xff0c;发送文件块BitTorrent&#xff1a;ti…

Java常用数据结构与集合

数据结构 数组&#xff1a; 内存地址连续检索效率高(可以通过下标访问成员)增删操作效率低(保证数据越界的问题,需动态扩容)长度固定&#xff0c;扩容的需要新的数组复制或者Arrays类的copyOf方法 链表 内存地址不连续查询快删除慢&#xff0c;因为需要移动指针又分双向链表…

基于Springboot的餐厅点餐系统

基于SpringbootVue的餐厅点餐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 首页展示 菜品详情页 菜品信息 个人中心 后台管理 菜品信息管理 用户管理 菜…

为什么负载电流增加时电源电压会下降?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 在以前的文章中我总是提到当负载电流增加时&#xff0c;电源的输出电压会下降&#xff0c;很多同学在实…

Kubernetes学习笔记12

k8s核心概念&#xff1a;控制器&#xff1a; 我们删除Pod是可以直接删除的&#xff0c;如果生产环境中的误操作&#xff0c;Pod同样也会被轻易地被删除掉。 所以&#xff0c;在K8s中引入另外一个概念&#xff1a;Controller&#xff08;控制器&#xff09;的概念&#xff0c;…

mysql索引与优化问题

作为一个java程序员&#xff0c;mysql数据库面试应该是比较多的了&#xff1b;而关于数据库的面试&#xff0c;最多的就是性能问题&#xff0c;而以性能为起点&#xff0c;延伸出很多具体的问题。 我们使用第一性原理的方法来分析&#xff0c;为什么面试中一定会问数据库的索引…

70 个常用的GIS Python 库

由于其多功能性、广泛的库生态系统和用户友好的语法&#xff0c;Python 已成为地理信息系统 (GIS) 和遥感领域的主导语言。这个 70 个地理空间 Python 库的汇编展示了可用于 GIS 和遥感数据处理和分析的丰富工具包。 Python 在 GIS 中的重要性源于它处理复杂地理空间数据的能力…

【学习】软件测试人员使用Loadrunner进行性能测试的优势

在软件测试领域&#xff0c;性能测试是一项至关重要的环节&#xff0c;它关乎到软件系统的稳定性和用户体验。而在这其中&#xff0c;Loadrunner作为一款久经考验的性能测试工具&#xff0c;凭借其独特的优势&#xff0c;成为了众多企业和开发者眼中的“得力助手”。 首先&…

打造你的私有云盘:安全优先、支持分享 | 开源日报 No.222

nextcloud/server Stars: 25.2k License: AGPL-3.0 nextcloud/server 是一个安全的数据存储空间&#xff0c;可以存储文件、联系人、日历等&#xff0c;并在各设备之间同步。用户可以分享数据并通过应用商店扩展功能。该项目提供加密机制、HackerOne 悬赏计划和双因素认证以确…

2024阿里云学生服务器申请图文全流程,学生机免费续费攻略

2024年阿里云学生服务器免费申请&#xff0c;完成学生认证可以领取1个月免费学生机&#xff0c;完成任务可以再免费学费6个月时长&#xff0c;还可以领取高校计划学生300元无门槛优惠代金券&#xff0c;阿里云服务器网aliyunfuwuqi.com整理2024年最新阿里云大学生服务器申请入口…

2024年重庆市三支一扶考试报名详细流程

2024年重庆市三支一扶考试报名详细流程

【vue】defineEmits 传值 子传父

先行知识 【vue】导入组件【vue】defineProps 传数据 父传子 传值流程 App.vue <template><Header getWeb"emitsGetWeb" userAdd"emitsUserAdd"/><hr /><p>web.name: {{ web.name }}</p><p>web.url: {{ web.url }}&…