Отправлять серверу команду «прекратить отправку сообщений» через отдельный интерфейс? - PullRequest
0 голосов
/ 27 августа 2018

Я хочу отправить моему серверу команду STOP, чтобы прервать команду SEND. Пользовательский интерфейс сервера отделен от сервера. Пользовательский интерфейс сервера подключается к серверу с помощью TCPClient и отправляет команду остановки (выполняется по назначению). Сервер никогда не входит в функцию StopSending (), которая имеет оператор print сразу после ввода и никогда не печатается. Сервер не прекращает отправку, а клиент получает все сообщения. Функция отправки находится в своем собственном потоке, однако сервер не находится в состоянии принять команду остановки. Как сервер должен получать команду остановки из пользовательского интерфейса во время отправки сообщений?

public void MakeServer()
    {
        mainListener = new TcpListener(IPAddress.Any, GetPortNumberFromFile());
        mainListener.Start();
        serverSendingListener = new TcpListener(IPAddress.Loopback, 5005);
        serverSendingListener.Start();
        serverReceivingListener = new TcpListener(IPAddress.Loopback, 5004);
        serverReceivingListener.Start();
        var listeningThread = new Thread(() =>
        {
            while (true)
            {
                try
                {

                    Console.WriteLine("server is created");
                    receivingClient = serverReceivingListener.AcceptTcpClient();
                    sendingClient = serverSendingListener.AcceptTcpClient();
                    Console.WriteLine("Server UI Connected.");

                    mainClient = mainListener.AcceptTcpClient();
                    Console.WriteLine("Client Connected.");
                    ThreadPool.QueueUserWorkItem(param =>
                    {
                        NetworkStream ns = receivingClient.GetStream();
                        byte[] bb = new byte[receivingClient.ReceiveBufferSize];
                        ns.Read(bb, 0, receivingClient.ReceiveBufferSize);
                        ServerCommand cmd = ServerCommand.DeSerialize(bb);

                        Console.WriteLine("command recieved");

                        switch (cmd.Cmd)
                        {
                            //process send command
                            case Command.SEND:
                                ProcessSendCommand(cmd);
                                break;

                            case Command.STOP:
                                StopSending();
                                break;
                        }
                        ns.Close();
                    }, null);

                } 
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            Console.WriteLine("End of loop.");
        }
        });

        listeningThread.IsBackground = true;
        listeningThread.Start();

    }

Функция отправки из пользовательского интерфейса:

sendingClient = new TcpClient("localhost", 5004);
            NetworkStream sendingStream = sendingClient.GetStream();
            byte[] bytes = ServerCommand.Serialize(new ServerCommand(Command.STOP, fileInput));
            sendingStream.Write(bytes, 0, bytes.Length);
            updateUI("Stop command sent.", textBox4);
            sendingClient.Close();
            receivingClient.Close();

Функция StopSending на сервере:

        private void StopSending()
    {
        stopFlag = 1;

        Console.WriteLine("--------Stop------------");

        if (sendingThread.IsAlive)
        {
            try
            {
                sendingThread.Abort();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
        else
        {
            Console.WriteLine("Sending thread not alive.");
        }
    }
...