我目前正在以c#形式制作客户端/服务器应用程序。该窗口具有日志(文本区域),命令行(文本区域)和一个按钮。我在运行时关闭服务器(另一个线程)时遇到问题。
void Server_Thread_Main(object arg)
{
TcpClient client;
Output.Insert_to_LOG_Window("Server initialized at IP: " + IP_ADDR + ":" + PORT);
while (true)
{
client = listener.AcceptTcpClient();
clients.Add(new C_Client(client, Output, client_ID_iter++));
clients[clients.Count - 1].Start();
}
}
我也有用于处理命令行输入命令的类。它叫做Task_Menager。每个命令都由新线程处理。对于proccesing命令,它具有此功能
void Server_Task_CMD(optargs args)
{
bool if_start = false;
foreach(argument arg in args)
{
switch (arg.Option)
{
case "-stop":
Output.server.Stop_Server(); //<- stopping server
break;
case "-start":
if_start = true;
break;
case "-IP":
Output.server.Set_Server_IP(arg.Value);
break;
case "-PORT":
Output.server.Set_Server_PORT(arg.Value);
break;
case "-IPP":
if (arg.Value.Contains(':') == true)
Output.server.Set_Server_Params(arg.Value);
else
Output.Insert_to_COMMAND_Log("This " + arg.Value + " isn't valid IP:PORT notation!");
break;
case "-V":
case "-VIEW":
Output.server.Display_IP_PORT();
break;
default:
Output.Insert_to_COMMAND_Log("Not known command: " + arg.Option + " !");
break;
}
if(if_start==true)
Output.server.Initialize_Server();
}
}
并且此功能是
public void Stop_Server()
{
if (server_thread.IsAlive == true)
{
Output.Insert_to_LOG_Window("Stopping server...");
server_thread.Interrupt();
if (!server_thread.Join(2000))
{
server_thread.Abort();
}
Output.Insert_to_COMMAND_Log("Server has been stopped!!!");
}
else
Output.Insert_to_LOG_Window("Server isn't running right now!");
}
问题是我不知道为什么服务器线程没有停止。
答案 0 :(得分:0)
这不是关闭线程的正确方法。目前你的帖子可能卡在listener.AcceptTcpClient
您应首先使用listener.Stop();
关闭听众
其次,你必须关闭所有客户端套接字
第三,除非绝对别无其他办法,否则你不应该致电thread.Abort
。
所以你的Stop_Server
应该更像这样:
public void Stop_Server()
{
listener.Stop();
server_thread.Join();
Output.Insert_to_COMMAND_Log("Server has been stopped!!!");
}
在你的线程方法中,用while (true)
try-catch(SocketException)
了解详情here