代码需要实现多个客户端连接,且服务器能够向每个客户端单独发送指令,请写出具体的代码
时间: 2024-02-28 10:54:56 浏览: 17
好的,以下是基于您的需求完善后的代码:
服务器端代码:
```C#
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Server
{
class Program
{
static List<TcpClient> clientsList = new List<TcpClient>(); // 用于存储客户端连接
static void Main(string[] args)
{
int port = 8888;
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Console.WriteLine("Server started.");
while (true)
{
TcpClient client = listener.AcceptTcpClient();
clientsList.Add(client); // 将新连接的客户端添加到列表中
Console.WriteLine("Client connected. Total clients: " + clientsList.Count);
// 处理客户端连接的线程
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
NetworkStream stream = client.GetStream();
byte[] welcomeMessage = Encoding.UTF8.GetBytes("Welcome to the server!");
stream.Write(welcomeMessage, 0, welcomeMessage.Length); // 发送欢迎消息
while (true)
{
byte[] data = new byte[1024];
int length = stream.Read(data, 0, data.Length);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("Received: " + message);
if (message.ToLower() == "exit") // 如果客户端发送了退出指令,则断开连接
{
clientsList.Remove(client);
Console.WriteLine("Client disconnected. Total clients: " + clientsList.Count);
break;
}
// 向每个客户端发送消息
foreach (TcpClient c in clientsList)
{
if (c != client) // 不向发送消息的客户端发送消息
{
byte[] response = Encoding.UTF8.GetBytes(message);
c.GetStream().Write(response, 0, response.Length);
}
}
}
});
thread.Start();
}
}
}
}
```
客户端代码:
```C#
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Client
{
class Program
{
static void Main(string[] args)
{
TcpClient client = new TcpClient();
client.Connect(IPAddress.Loopback, 8888);
Console.WriteLine("Connected to server.");
NetworkStream stream = client.GetStream();
// 子线程用于接收服务器消息
System.Threading.Thread receiveThread = new System.Threading.Thread(() =>
{
while (true)
{
byte[] data = new byte[1024];
int length = stream.Read(data, 0, data.Length);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("Received: " + message);
}
});
receiveThread.Start();
// 主线程用于发送消息
while (true)
{
Console.Write("Message to send: ");
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
stream.Write(data, 0, data.Length);
}
}
}
}
```
在以上代码中,我们使用了一个 `List<TcpClient>` 来存储客户端连接,每当有新的客户端连接时,就将其添加到列表中。在处理客户端连接的线程中,我们使用了一个 `foreach` 循环来向每个客户端发送消息,但是不向发送消息的客户端自己发送消息。
在客户端代码中,我们使用了两个线程来分别接收和发送消息。接收消息的线程会不断从网络流中读取数据并输出到控制台,而发送消息的线程则会等待用户输入并将消息发送到服务器。