==============线程socket端口监听问题!请求帮忙! ================
- C# code
using System;using System.Text;using System.Net;using System.IO;using System.Web.Security;using System.Net.Sockets;using System.Threading;namespace SocketCilent{ /// /// BusSocket 的摘要说明。 /// public class SocketTest { private Socket socket; //获得的Socket private int PORT=9999; //监听的端口 private Thread ThListen; private TcpListener tcp; public void Start() { try { ThListen = new Thread(new ThreadStart(jianting)); ThListen.Start(); } catch { } } public void Stop() { try { tcp.Stop(); ThListen.Abort(); } catch { [b][color=#FF0000]//{"未将对象引用设置到对象的实例。" }一调用这个方法就提示[/color][/b] } } private void jianting() { try { NetworkStream netStream; byte[] GetMsgByte = new byte[1024]; byte[] ReturnMsgByte = new Byte[2]; tcp= new TcpListener(PORT); tcp.Start(); while(true) { socket = tcp.AcceptSocket(); if(socket.Connected) { netStream = new NetworkStream(socket, true); netStream.Read(GetMsgByte, 0, GetMsgByte.Length); netStream.Flush(); netStream.Close(); socket.Close(); } } } catch { [color=#FF0000]//{"通常每个套接字地址(协议/网络地址/端口)只允许使用一次。" }[/color][b][/b] } }}
现在我想怎么停止监听端口停止线程
如果停止不了Application.Exit(); 这个应用程序就关闭不了!一关闭了在进程里还有!
[解决办法]
private TcpListener tcp;
定义在主线程中,但是是在新建的ThListen线程中实例化的,但是你的Stop方法估计你还是在主线程调用的,所以执行tcp.Stop()时就会提示“未将对象引用设置到对象的实例”。
建议你把tcp的实例化放到主线程中做。由于Stop方法执行第一句就有错误,后面的终止线程方法
ThListen.Abort();没有执行,所以在线程还是运行的情况下你的应用程序当然无法正常退出了。
[解决办法]
ThListen不要放在线程中实例化。主线程中识别不到的
[解决办法]
方法很简单。
正常结束:(强烈推荐)
定义一个全局的bool变量RUN,然后将线程回调函数的全部代码放入到while(run)中,最后在退出程序之前将RUN的值改为false,这样就可以让线程自行终止并给予线程回收资源的机会,这样应用程序会自行正常终止的。
暴力方法:(不推荐)
System.Environment.Exit(Environment.ExitCode);//强制结束当前程序并退出所有线程。
终极方法:(强烈不推荐)
System.Diagnostics.Process.GetCurrentProcess().Kill();
强行结束当前进程啊。没有给应用程序回收资源的机会就会直接强制退出程序的。可以暂时解决问题的。