C#客户端服务器队列应用程序

本文关键字:应用程序 队列 服务器 客户端 | 更新日期: 2023-09-27 18:23:47

我对c#中的客户端-服务器编程很陌生。我目前正在c中创建一个简单的队列应用程序,为连接的每个客户端使用线程。有人能帮我拿密码吗?

这个代码的问题是,即使连接了更多的客户端,它也只能从一个客户端读取。

       using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    namespace Server
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            static TcpListener tcpListener;
            NetworkStream networkStream;
            System.IO.StreamWriter streamWriter;
            System.IO.StreamReader streamReader;
            string[,] client = new string[999, 3];
            int connectedclient = 0;
            int queuecount = 0;
            int[] peopleque = new int[999];
            int quenumber = 0;
            public void Listener()
            {
                Socket socketForClient = tcpListener.AcceptSocket();
                string clientip = "";
                if (socketForClient.Connected)
                {
                    AddItem("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
                    client[connectedclient, 0] = socketForClient.RemoteEndPoint.ToString();
                    client[connectedclient, 2] = "active";
                    connectedclient++;
                    networkStream = new NetworkStream(socketForClient);
                    streamWriter = new System.IO.StreamWriter(networkStream);
                    streamReader = new System.IO.StreamReader(networkStream);
                    clientip = socketForClient.RemoteEndPoint.ToString();
                    while (true)
                    {
                        string theString = streamReader.ReadLine();
                        if (theString != null && theString != "" && theString != " ")
                        {
                            string Connection = socketForClient.RemoteEndPoint.ToString();
                            AddItem("Message received by client (" + Connection + ") : " + theString);
                            if (theString[0] == 'r')
                            {
                                for (int i = 0; i < connectedclient; i++)
                                {
                                    if (client[i, 0] == socketForClient.RemoteEndPoint.ToString())
                                    {
                                        client[i, 1] = theString.Substring(1);
                                        AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is connected as kassa " + client[i, 1]);
                                    }
                                }
                            }
                            if (theString[0] == 'q')
                            {
                                streamWriter.Write(theString);
                                streamWriter.Flush();
                            }
                            switch (theString)
                            {
                                case "exit":
                                    string connectedip = socketForClient.RemoteEndPoint.ToString();
                                    for (int i = 0; i < connectedclient; i++)
                                    {
                                        if (client[i, 0] == connectedip)
                                        {
                                            client[i, 0] = "";
                                            client[i, 1] = "";
                                            client[i, 2] = "";
                                            if (connectedclient - 1 != 0)
                                            {
                                                connectedclient--;
                                                client[i, 0] = client[connectedclient, 0];
                                                client[i, 1] = client[connectedclient, 1];
                                                client[i, 2] = client[connectedclient, 2];
                                                client[connectedclient, 0] = "";
                                                client[connectedclient, 1] = "";
                                                client[connectedclient, 2] = "";
                                                break;
                                            }
                                            break;
                                        }
                                    }
                                    socketForClient.Disconnect(true);
                                    socketForClient.Close();
                                    break;
                                case "break":
                                    connectedip = socketForClient.RemoteEndPoint.ToString();
                                    for (int i = 0; i < connectedclient; i++)
                                    {
                                        if (client[i, 0] == connectedip)
                                        {
                                            client[i, 2] = "inactive";
                                            AddItem("client " + socketForClient.RemoteEndPoint.ToString() + " is inactive");
                                            break;
                                        }
                                    }
                                    break;
                                case "empty":
                                    for (int i = 0; i < connectedclient; i++)
                                    {
                                        if (client[i, 0] == socketForClient.RemoteEndPoint.ToString())
                                        {
                                            if (queuecount <= 0)
                                            {
                                                client[i, 2] = "empty";
                                                AddItem("Client " + socketForClient.RemoteEndPoint.ToString() + " is empty");
                                            }
                                            else
                                            {
                                                streamWriter.WriteLine("q" + peopleque[0] + "t" + client[i, 1]);
                                                peopleque[0] = 0;
                                                for (int j = 0; j < quenumber - 1; j++)
                                                {
                                                    peopleque[j] = peopleque[j + 1];
                                                }
                                                peopleque[queuecount] = 0;
                                                queuecount--;
                                                streamWriter.Flush();
                                            }
                                        }
                                    }
                                    break;
                                case "new":
                                    quenumber++;
                                    bool found = false;
                                    for (int i = 0; i < queuecount; i++)
                                    {
                                        if (client[i, 2] == "empty")
                                        {
                                            streamWriter.Write("q" + quenumber + "t" + client[i, 1]);
                                            streamWriter.Flush();
                                            found = true;
                                            break;
                                        }
                                    }
                                    if (found == false)
                                    {
                                        peopleque[queuecount] = quenumber;
                                        queuecount++;
                                    }
                                    break;
                            }
                            if (theString == "exit")
                                break;
                        }
                    }
                    streamReader.Close();
                    networkStream.Close();
                    streamWriter.Close();
                }
                AddItem("client " + clientip + " Has Disconnected");
                socketForClient.Close();
            }
            public void StartListening(int NumberOfClient)
            {
                tcpListener.Start();
                for (int i = 0; i < NumberOfClient; i++)
                {
                    Thread newThread = new Thread(new ThreadStart(Listener));
                    newThread.Start();
                }
            }
            public MainWindow()
            {
                InitializeComponent();
            }
            private void AddItem(string item)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    LogListener.Items.Add(item);
                    LogListener.SelectedIndex = LogListener.Items.Count - 1;
                    LogListener.ScrollIntoView(LogListener.Items[LogListener.Items.Count - 1]);
                }));
            }
            private void StartBtn_Click(object sender, RoutedEventArgs e)
            {
                //tcpListener = new TcpListener(Convert.ToInt32(PortTxt.Text));
                IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
                tcpListener = new TcpListener(ip.MapToIPv4(), Convert.ToInt32(PortTxt.Text)); 
                tcpListener.Start();
                AddItem("************This is Server program************");
                AddItem("This Computer IP Is : " + ip.MapToIPv4().ToString());
                PortTxt.IsEnabled = false;
                StartBtn.IsEnabled = false;
                StartListening(200);
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    streamWriter.WriteLine("Fuck");
                    streamWriter.Flush();
                }
                catch
                {
                    Console.WriteLine("Exception reading from Server");
                }
            }
            private void btnCheck_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < connectedclient; i++)
                {
                    AddItem(client[i, 0]);
                }
            }
        }
}

C#客户端服务器队列应用程序

您当前在具有相同TCP连接的同一端口上启动一组Listener实例。这不会像你想象的那样奏效(正如你所注意到的)。诀窍是打开一个套接字并接受客户端。当客户端被接受时,您将生成一个处理通信的新线程。基本方案是:

  1. 创建Socket
  2. 呼叫BeginAcceptSocket
  3. BeginAcceptSocket的回调中,为连接的客户端生成一个新线程
  4. 再次调用BeginAcceptSocket以侦听新客户端