一、问题
原因就是关闭程序时,没有将套接字、线程关闭,导致程序仍在运行,因而第二次开始的时候会出现这种问题。
在VS编写TCP程序的时候,因为使用的是windows窗体应用,直接关闭窗体时没有关闭监听和线程,导致第二次运行时无法打开服务器。
二、解决方案
1.处理错误
1.1 关闭VS,打开任务管理器,找到之前运行的exe,将其关闭
1.2 找到VS工作目录下:\bin\Debug*.exe, 将exe文件删除。
ps: 如果exe文件无法,重启电脑,简单粗暴。。。
2.解决错误
实际上,遇到这种错误,是因为直接关闭了窗口程序,而没有关闭监听和线程,线程仍在后台运行,导致第二次开启的时候出现已被开启的状况。
所以,关闭至关重要。
2.1
在这里,我使用的是C#的Windows窗体应用,在UI界面,设置窗体form的关闭事件。
打开UI界面,右键属性,设置触发的函数。
2.2
在将要关闭窗体时,如果确定要关闭,那么停止TcpListener的监听行为和销毁线程,调用TcpListener的stop()方法和Thread的Abort()方法。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dr = MessageBox.Show("关闭服务器将无法接收到来自客户端的数据,你确定要关闭吗?", "服务器信息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dr == DialogResult.Yes)
{
Listener.Stop();
this.Thread.Abort();
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
三、总结
在使用了某一个模块或函数后,如果不要使用了,千万要将其关闭,否则就会出现各种问题。。。。