Я хочу отправить моему серверу команду 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.");
}
}