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