2013-01-11 36 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'作爲偵聽器地址,而不是硬編碼一個特定的地址。 –

相關問題