Общайтесь одновременно с несколькими TCP-клиентами - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь создать приложение для отслеживания работы, и я хочу, чтобы оно было там, где работодатель может заблокировать приложение, и приложение блокируется на всех компьютерах сотрудника одновременно. Вот код, который у меня есть для сервера:

 private void btnStart_Click(object sender, EventArgs e)
        {
            // Start listening for TCP connections:
            listener = new TcpListener(IPAddress.Any, int.Parse(txtServerPort.Text));
            listener.Start();
            lbChat.Items.Add($"Server started on IP: {displayIP} and Port: {txtServerPort.Text}");
            isStarted = true;
            Server.RunWorkerAsync();
        }

        private void Server_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                clientList.Add(client);
                foreach(TcpClient tcp in clientList)
                {
                    STR = new StreamReader(tcp.GetStream());
                    STW = new StreamWriter(tcp.GetStream());
                    STW.AutoFlush = true;
                }

                if(!backgroundWorker1.IsBusy & !backgroundWorker2.IsBusy)
                {
                    backgroundWorker1.RunWorkerAsync();
                    backgroundWorker2.WorkerSupportsCancellation = true;
                }
            }
        }

        // Recieve messages from the employee's computer:
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            foreach(TcpClient tcp in clientList)
            {
                while (tcp.Connected)
                {
                    try
                    {
                        recieve = STR.ReadLine();
                        this.lbChat.Invoke(new MethodInvoker(delegate ()
                        {
                            lbChat.Items.Add(recieve + "\n");
                            if (recieve.Contains(">"))
                            {
                                // Add employee name to connected list:
                                string name = recieve.Split(new string[] { "'" }, StringSplitOptions.None)[1].Split('\'')[0].Trim();
                                employeesList.Add(name);
                                lbConnected.Items.Add(name);
                            }
                            else if (recieve.Contains("<"))
                            {
                                string name = recieve.Split(new string[] { "'" }, StringSplitOptions.None)[1].Split('\'')[0].Trim();
                                employeesList.Remove(name);
                                lbConnected.Items.Clear();
                                foreach (string employee in employeesList)
                                {
                                    lbConnected.Items.Add(employee);
                                }
                            }
                        }));
                        recieve = "";
                    }
                    catch (Exception ex)
                    {
                        Console.Write(ex.Message.ToString());
                    }
                }
            }

        }

        // Send messages to employee's computer:
        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            foreach(TcpClient tcp in clientList)
            {
                if (tcp.Connected)
                {
                    STW.WriteLine(TextToSend);
                }
                else
                {
                    MessageBox.Show("Sending failed");
                }
            }
        }

В основном происходит то, что сервер получит уведомление о том, что первый клиент подключился, однако он не получит это уведомление от второго клиента, который подключается, однако только второй клиент получает и отправляет уведомления после подключения, а первый клиент нет. Однако если я сначала отключу первый клиент, сервер получит уведомление о том, что первый клиент отключился, а затем он также получит уведомление, когда второй отключится. Однако если я сначала отключу второго клиента, сервер не будет проинформирован об этом. Так что я действительно не уверен, что делать со всем этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...