我服务端上有两个客户端连接,如何在服务端在上确定那个客户端的对应的用户是谁

例如

我服务端上有两个客户端连接,如何在服务端在上确定那个客户端的对应的用户是谁


关注🕒上午好,题主!目前:🟢[在线]
📢参考GPT-4o mini 模型、由清水白石008整理提供!
📣今日金句:“生活就像骑自行车。要保持平衡,就得不断前进。” — 阿尔伯特·爱因斯坦
在 C# 中使用 Socket 通信时,通常需要在服务端维护一个客户端连接的列表,并将每个连接与其对应的用户信息(如别名、用户名等)关联起来。以下是一个基本的实现思路,帮助你在服务端确定当前连接的客户端对应的用户。
首先,定义一个类来存储客户端的连接信息和用户别名。
public class ClientInfo
{
public Socket ClientSocket { get; set; }
public string UserName { get; set; }
public ClientInfo(Socket socket, string userName)
{
ClientSocket = socket;
UserName = userName;
}
}
在服务端,使用一个集合(如 List<ClientInfo> 或 Dictionary<Socket, ClientInfo>)来存储所有连接的客户端信息。
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class Server
{
private List<ClientInfo> clients = new List<ClientInfo>();
private Socket serverSocket;
public void Start()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
serverSocket.Listen(10);
Console.WriteLine("Server started...");
while (true)
{
Socket clientSocket = serverSocket.Accept();
Thread clientThread = new Thread(HandleClient);
clientThread.Start(clientSocket);
}
}
private void HandleClient(object clientObj)
{
Socket clientSocket = (Socket)clientObj;
// 这里可以接收用户的别名
byte[] buffer = new byte[1024];
int receivedBytes = clientSocket.Receive(buffer);
string userName = Encoding.UTF8.GetString(buffer, 0, receivedBytes);
// 创建 ClientInfo 对象并添加到列表
ClientInfo clientInfo = new ClientInfo(clientSocket, userName);
clients.Add(clientInfo);
Console.WriteLine($"User {userName} connected.");
// 处理客户端消息
while (true)
{
try
{
receivedBytes = clientSocket.Receive(buffer);
if (receivedBytes == 0) break; // 客户端断开连接
string message = Encoding.UTF8.GetString(buffer, 0, receivedBytes);
Console.WriteLine($"Message from {userName}: {message}");
}
catch (SocketException)
{
break; // 处理异常
}
}
// 客户端断开连接
clients.Remove(clientInfo);
Console.WriteLine($"User {userName} disconnected.");
clientSocket.Close();
}
}
在客户端连接时,首先发送用户的别名到服务端。以下是一个简单的客户端示例:
using System;
using System.Net.Sockets;
using System.Text;
public class Client
{
public void Connect(string userName)
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect("127.0.0.1", 8080);
// 发送用户别名
byte[] buffer = Encoding.UTF8.GetBytes(userName);
clientSocket.Send(buffer);
// 发送消息
while (true)
{
string message = Console.ReadLine();
buffer = Encoding.UTF8.GetBytes(message);
clientSocket.Send(buffer);
}
}
}
Socket 和对应的用户别名关联起来。ClientInfo 对象来确定哪个客户端发送了消息。通过这种方式,你可以在服务端轻松地识别每个客户端的用户别名。希望这个示例能帮助你实现你的需求!如果有其他问题,请随时问我。