Henrybcg 2024-08-23 14:28 采纳率: 0%
浏览 41

c# socket通讯 如何在服务端上确定当前连接和客户端对应的别名是哪个

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

img


例如

img

  • 写回答

2条回答 默认 最新

  • 铭渊老黄 新星创作者: Python技术领域 2024-08-23 14:56
    关注
    🕒上午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“生活就像骑自行车。要保持平衡,就得不断前进。” — 阿尔伯特·爱因斯坦
    

    在 C# 中使用 Socket 通信时,通常需要在服务端维护一个客户端连接的列表,并将每个连接与其对应的用户信息(如别名、用户名等)关联起来。以下是一个基本的实现思路,帮助你在服务端确定当前连接的客户端对应的用户。

    1. 创建一个客户端信息类

    首先,定义一个类来存储客户端的连接信息和用户别名。

    public class ClientInfo
    {
        public Socket ClientSocket { get; set; }
        public string UserName { get; set; }
    
        public ClientInfo(Socket socket, string userName)
        {
            ClientSocket = socket;
            UserName = userName;
        }
    }
    

    2. 在服务端维护一个客户端列表

    在服务端,使用一个集合(如 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();
        }
    }
    

    3. 客户端连接时发送别名

    在客户端连接时,首先发送用户的别名到服务端。以下是一个简单的客户端示例:

    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);
            }
        }
    }
    

    4. 总结

    • 在服务端维护一个客户端列表,将每个连接的 Socket 和对应的用户别名关联起来。
    • 在客户端连接时,首先发送用户的别名到服务端。
    • 在服务端处理消息时,可以通过 ClientInfo 对象来确定哪个客户端发送了消息。

    通过这种方式,你可以在服务端轻松地识别每个客户端的用户别名。希望这个示例能帮助你实现你的需求!如果有其他问题,请随时问我。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月23日