通过单独的UI向服务器发送“停止发送消息”命令?

时间:2018-08-27 20:19:54

标签: tcp client-server tcpclient tcplistener

我想向服务器发送一个STOP命令,以中断SEND命令。服务器UI与服务器是分开的。服务器UI使用TCPClient连接到服务器并发送stop命令(按预期执行)。服务器从不进入StopSending()函数,该函数在您输入后即会立即显示一条打印语句,并且永远不会被打印。服务器不会停止发送,并且客户端会接收所有消息。 send函数位于其自己的线程中,但是服务器未处于接收停止命令的状态。在发送消息的过程中,服务器应如何从UI接收停止命令?

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

0 个答案:

没有答案