读书人

==============线程socket端口监听有关

发布时间: 2012-02-14 19:19:19 作者: rapoo

==============线程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();
强行结束当前进程啊。没有给应用程序回收资源的机会就会直接强制退出程序的。可以暂时解决问题的。

读书人网 >C#

热点推荐