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个客户端就能实现群发消息了