具有多类型客户端的 c# 服务器角色

本文关键字:服务器 角色 客户端 多类型 | 更新日期: 2023-09-27 18:34:08

我正在尝试构建服务器客户端应用程序(wpf)。

我试图完成的结构是这样的:

  1. 仅发送数据(简单字符串)的客户端必须是 WPF 应用。
  2. 仅接收数据的客户端(来自发送方客户端的字符串)
  3. 将数据从发送方
  4. 传输到接收方的服务器(可以是多个发送方和多个接收方)可以是控制台应用。

我面临的问题之一是如何分离服务器角色。

第二个问题是我如何让服务器知道它正在与哪种类型的客户端通信,发送方还是接收方。

这是我的代码:


服务器:

using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows;
namespace NetMessageServerWpf
{
    public partial class MainWindow : Window
    {
        TcpClient client;
        public MainWindow()
        {
            InitializeComponent();
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            if(client == null || !client.Connected)
                client = this.tcpListener.AcceptTcpClient();
            msg = txtMessage.Text;
            SendTCP(client);
        }
        public TcpListener tcpListener;
        public Thread listenThread;
        private string msg;
        private void ListenForClients()
        {
            this.tcpListener.Start();
        }
        public void SendTCP(TcpClient tcpClient)
        {
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(this.msg);
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
    }
}

客户:

namespace NetClientSideWpf
{
    class Client : Base
    {
        private string messageString;
        public string MessageString
        {
            get { return messageString; }
            set
            {
                messageString = value;
                OnPropertyChanged("MessageString");
            }
        }

        public Client()
        {
            ConnectToServer();
        }
        public void ConnectToServer()
        {
            TcpClient client = new TcpClient();
            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
            client.Connect(serverEndPoint);

            NetworkStream clientStream = client.GetStream();
            Thread ServerThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            ServerThread.Start(client);

        }
        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] message = new byte[4096];
            int bytesRead;
            while (true)
            {
                bytesRead = 0;
                try
                {
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    break;
                }
                if (bytesRead == 0)
                {
                    break;
                }
                ASCIIEncoding encoder = new ASCIIEncoding();
                MessageString = encoder.GetString(message, 0, bytesRead);
            }
        }
    }
}

提前感谢! :)

具有多类型客户端的 c# 服务器角色

首先,我会将客户端包装在一个可以调用方法的Client对象中。

然后,当客户端连接时,它应该发送一条消息,详细说明其模式:

"IAm:发件人"

"IAm:接收者"

如果需要,您可以将第二部分解析为enum。然后,您将根据模式对Client对象进行排序:

List<Client> clients;
client.Mode = Enum.Parse(typeof(ClientMode), message.Split(':')[1]);
clients.Add(client);

当"发送方"发送"广播"消息时,您会将其写入recievers列表中的每个Client对象。这将在客户端读取线程中

if (sender.Type == ClientMode.Sender)
{
    foreach (Client client in clients.Where(c => c.Type == ClientMode.Sender)
        client.Send(message)
}

显然,这些都是非常广泛的笔触,对于SO来说,完整的实施将太大。希望这能让您走上正确的轨道,如果我能澄清任何事情,请告诉我!