C#TcpListener AcceptSocket在单独的线程中不起作用

时间:2013-01-11 14:51:43

标签: c# winforms multithreading tcplistener

我有一个基于TcpListener的简单TCP服务器。由于我想在Windows窗体应用程序中使用它,我使它在一个单独的线程中运行,如下所示:

 public void Start() {          
        this.serverThread = new Thread(new ThreadStart(this.ThreadProcess));
        this.serverThread.Name = "Tcp-Server";
        this.serverThread.Start();
    }
 protected void ThreadProcess() {
        try
        {
            IPAddress ipAd = IPAddress.Parse("169.254.42.86");
            this.listener = new TcpListener(ipAd, this.port);
            this.listener.Start();
            Socket mySocket = this.listener.AcceptSocket();
            while (true)
            {                    
                if (mySocket.Connected)
                {                        
                    byte[] RecvBytes = new byte[8192];
                    int byteNo = mySocket.Receive(RecvBytes, RecvBytes.Length, 0);                     
                    ASCIIEncoding asen = new ASCIIEncoding();
                    mySocket.Send(asen.GetBytes("srv reply msg"));                     
                }
                else
                {
                    WriteLine("socket not connected.");
                }
            }
        }
        finally {
            StopListener();
        }
    }

如果我在控制台应用程序中使用此服务器:

static void Main(string[] args)
    {
        try
        {                
            int port = 8001;
            Server server = new Server(port);
            server.Start();                             
            while (true) {
                //server is running in separate thread          
            }   
            ...

一切都按预期工作。但是,当我尝试将其包含在单击按钮时启动服务器的Windows窗体应用程序中时,代码将不再起作用。服务器线程正在启​​动,但它不接受任何套接字。 有什么东西我错过了吗?我一直在谷歌搜索高低没有结果... 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

不是一个答案,但在评论中输入的内容太多了:

调试此问题的最简单方法是在同一个线程中调用ThreadProcess()方法:

public void Start() {          
    ThreadProcess();
    //this.serverThread = new Thread(new ThreadStart(this.ThreadProcess));
    //this.serverThread.Name = "Tcp-Server";
    //this.serverThread.Start();
}

然后,您可以单步执行代码以查看会发生什么。只要您点击this.listener.AcceptSocket();行,您的应用就会阻止,但您应该可以连接到它。

通常问题是每个人都会忽视的问题,例如Start()方法没有被调用。