2013-01-13 272 views
-1

所以我搜索了大約2周這個,我找不到任何合法的答案。不斷偵聽的套接字

我有兩個項目,一個是服務器,另一個是客戶端。

我只設法創建一個客戶端控制檯應用程序,只將數據發送到服務器,然後退出。沒有其他的。

那麼如何讓客戶端通過網絡將文本框中的字符串發送到服務器,並且服務器可以持續監聽。總是傾聽。不僅僅是監聽一次並完成程序,而是等待連接,當連接建立時,服務器接受客戶端的字符串,寫入字符串或寫入文本框,然後立即返回監聽連接。

我正在使用Windows窗體應用程序,所以我不想要一個控制檯應用程序示例。

你可以使用的TcpClient和的TcpListener ...

+0

一個建議是使用'BeginReceive'和[Socket](http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx)類上的'EndReceive'。然後在回調處理程序中再次調用'BeginReceive'。 –

回答

2

我不喜歡這樣寫道:

void Loop() 
{ 
    TcpListener l = new TcpListener(IPAddress.Any, Port); 
    WaitHandle[] h = new WaitHandle[2]; 
    h[0] = StopEvent; 

    WriteInfo("Listening on port {0}", Port); 

    l.Start(); 
    while (true) 
    { 
     var r = l.BeginAcceptTcpClient(null, null); 
     h[1] = r.AsyncWaitHandle; 
     // Wait for next client to connect or StopEvent 
     int w = WaitHandle.WaitAny(h); 
     if (w == 0) // StopEvent was set (from outside), terminate loop 
      break; 
     if (w == 1) 
     { 
      TcpClient c = l.EndAcceptTcpClient(r); 

      c.ReceiveTimeout = 90000; 
      c.SendTimeout = 90000; 

      // client is connected, spawn thread for it and continue to wait for others 
      var t = new Thread(ServeClient); 
      t.IsBackground = true; 
      t.Start(c); 
     } 
    } 
    l.Stop(); 

    WriteInfo("Listener stopped"); 
} 

其中Loop某處開始這樣的:

StopEvent = new ManualResetEvent(false); 
    LoopThread = new Thread(Loop); 
    LoopThread.Start(); 

StopEvent用於終止聽力循環。 ServeClient作爲名稱表示連接的客戶端,看起來像這樣:

void ServeClient(object State) 
    { 
     TcpClient c = (TcpClient)State; 

     NetworkStream s = c.GetStream(); 
     try 
     { 
      // Communicate with your client 
     } 
     finally 
     { 
      s.Close(); 
      c.Close(); 
     } 
    } 

這部作品在任何.NET應用程序(Windows服務,控制檯,WPF或WinForms的)

+0

使用異步tcp客戶機/服務器還有另一種可能性,我認爲它更舒適。同樣對於線程:使用布爾變量來中止while循環。否則,你必須通過使用Thread.Abort()來強制退出它,這是一件壞事。 ;) 異步TCP客戶端的好例子: http://robjdavey.wordpress.com/2011/07/29/improved-asynchronous-tcp-client-example/ – Neurodefekt

+0

是的,Neurodefekt,我希望看到一些解釋在異步套接字和TCP。介意在這裏分享一些例子? –

+0

只要設置了StopEvent,while循環就會正常終止。沒有必要放棄它。可以使用類似的方法來終止此處未顯示的客戶端線程 – CubeSchrauber