我想向服务器发送一个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.");
}
}