2013-01-11 38 views
0

我有一个基于TcpListener的简单TCP服务器。因为我想在Windows窗体应用程序使用它我把它在一个单独的线程中运行,如下所示:C#TcpListener AcceptSocket不能在单独的线程中工作

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窗体应用程序中时,代码不再工作。服务器线程正在启​​动,但它不接受任何套接字。 有什么,我失踪?我一直在谷歌搜索高低无结果... 感谢您的任何帮助!

+0

我没有看到任何原因为什么代码不应该在Windows窗体应用程序中工作。问题似乎在别的地方。 – Tilak

+0

可能发生异常并调用StopListener。这是一个TCP连接,客户端断开连接不正常会导致异常,您应该尝试在循环中补偿该错误 – TimothyP

+0

您可以发布确切的方法来启动WinForms应用程序中的套接字吗?我怀疑它可能是那里的东西,但我们不知道它是怎么样的... –

回答

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()方法没有被调用。

+0

我只是这样做,正如你所说,应用程序块,但听众仍然不接受套接字。我双重检查了它,同一段代码在控制台应用程序中起作用。 – TropE

+1

并且'this.port'是您尝试连接的端口?也可以使用'IPAddress.Any'作为侦听器地址,而不是硬编码一个特定的地址。 –

相关问题