Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多类型客户端的c#服务器角色_C#_Wpf_Multithreading_Client_Server - Fatal编程技术网

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

具有多类型客户端的c#服务器角色,c#,wpf,multithreading,client,server,C#,Wpf,Multithreading,Client,Server,我正在尝试构建一个服务器客户端应用程序(wpf) 我试图实现的结构是: 只发送数据(简单字符串)的客户端需要是wpf应用程序 仅接收数据的客户端(来自发送方客户端的字符串) 将数据从发送方传输到接收方的服务器(可以是多个发送方和多个接收方)可以是控制台 应用程序 我面临的问题之一是如何分离服务器角色 第二个问题是如何让服务器知道它正在与哪种类型的客户机通信,发送方还是接收方 这是我的代码: 服务器: using System.Net; using System.Net.Sockets; usi

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

我试图实现的结构是:

  • 只发送数据(简单字符串)的客户端需要是wpf应用程序
  • 仅接收数据的客户端(来自发送方客户端的字符串)
  • 将数据从发送方传输到接收方的服务器(可以是多个发送方和多个接收方)可以是控制台 应用程序
  • 我面临的问题之一是如何分离服务器角色

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

    这是我的代码:


    服务器:

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

    提前感谢!:)

    首先,我将把您的客户机包装在一个
    Client
    对象中,您可以在该对象上调用方法

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

    “IAm:发件人”

    “IAm:接受者”

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

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

    显然,这些都是非常宽泛的举措,而完整的实施规模太大,无法做到这一点。希望这能让你走上正轨,如果我能澄清任何事情,请告诉我

    我不明白你的第一个问题,好像你已经把服务器分开了。至于第二个问题,客户端知道他们是否是发送者/接收者,对吗?至于我的第一个问题,我现在拥有的服务器同时扮演两个角色,即服务器和发送者。我希望服务器接受来自发送方的数据,并将其传输到所有接收方(就像拖缆一样,但我当然希望使用tcp而不是udp)。至于我的第二个问题,是的,客户知道它是什么类型的。(无论如何,我不会在接收方客户端的gui上创建一个发送按钮)好的,发送者是否也会接收其他发送的消息,或者发送者只是发送?一旦我知道了,我可以回答(至少用概括的方式回答)。现在我希望发件人只发送数据,但我不介意他们从服务器接收数据(但只接收某些数据,如已发送/已接收消息的状态),但这一功能可以在此过程中添加…谢谢,这是我的想法,但我很难实现它。我不习惯使用线程和TCP。这对我来说是一个新领域。@Sag1v您有什么特别的问题吗?我的回答有意义吗?好吧,我想的是向客户机添加一个“Type”属性,并在它发送的字符串中给它一个特殊的标志,服务器可以解析它。但我不明白的是,如何让服务器做到这一点,以及如何让服务器接收消息并自动将其发送到接收者列表。@Sag1v我试图提供一些简单(但不完整)的示例来说明如何做这些事情。那有用吗?谢谢。所以基本上我有一个客户机类和一个服务器类(甚至是另一个项目)。。。你能告诉我你的代码是如何在我的代码上工作的吗?
    if (sender.Type == ClientMode.Sender)
    {
        foreach (Client client in clients.Where(c => c.Type == ClientMode.Sender)
            client.Send(message)
    }