日期:2014-05-18  浏览次数:20789 次

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