2014-10-31 184 views
0

我有一臺服務器和2個winform客戶端(對於tictactoegame)。我能立即檢測到客戶端斷開連接嗎?首先打開的客戶端是player1套接字,第二個是player2。一旦兩個客戶端連接,player1必須點擊一個按鈕,並且player2按鈕全部禁用。 PLAYER1點擊一個按鈕後player2buttons啓用和PLAYER1按鈕禁用...等等c#檢測客戶端從服務器斷開連接

isConnected方法

public bool IsConnected(Socket socket) 
{ 
    try 
    { 
     return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); 
    } 
    catch (SocketException) { return false; } 
} 

Server代碼

public class ServerApp 
{ 
    public Socket serverSocket; 

    Socket player1; 
    Socket player2; 
    ServerGame myGame; 

    public ServerApp() 
    { 
     myGame = new ServerGame(); 
     serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
            ProtocolType.Tcp); 
     IPEndPoint ipLocal = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8221); 
     serverSocket.Bind(ipLocal); 
     serverSocket.Listen(4); 

     Console.WriteLine("Waiting for clients ..."); 
     player1 = serverSocket.Accept(); 
     Console.WriteLine("Player 1 joined"); 
     player2 = serverSocket.Accept(); 
     Console.WriteLine("Player 2 joined"); 

     myGame.InitGame(); 

     while (true) 
     { 
      try 
      { 
       myGame.Display(); 
       Console.WriteLine(); 

       myGame.Send(player1, BaseGame.Player.One); 
       myGame.Send(player2, BaseGame.Player.Two); 

       if (myGame.GetActivePlayer() == BaseGame.Player.One && 
        myGame.IsConnected(player1)==true) 
       { 
        myGame.Receive(player1);      
       } 
       else if(myGame.IsConnected(player1) == true) 
       { 
        myGame.Receive(player2); 
       } 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine(e); 
       Thread.Sleep(1000);      
      } 
     } 

     Console.WriteLine("Server going down"); 
     Thread.Sleep(2000); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ServerApp serverApp = new ServerApp(); 
    } 
} 
+1

定義「即刻」。計算機無法立即做任何事情,只有你或我無法做到。根據網絡連接的不同,套接字的優雅關閉可能會非常快速地發生。重置(丟失連接)可能會或可能不會被快速檢測到,具體取決於發生了什麼。你應該對你問的問題更具體。 – 2014-10-31 19:51:55

+0

假設player1必須點擊一個按鈕,然後player2按鈕被禁用。如果我關閉player1,我怎麼能檢測到我關閉它(它等待player2點擊一個按鈕,但player2按鈕被禁用)。如果我想關閉player2,當我點擊player1時,我在控制檯上看到一條消息(播放器2 disconnectctetc) – user3645080 2014-10-31 19:54:55

+0

是否有一行代碼會導致上述示例中的問題? – 2014-10-31 20:13:14

回答

0

玩家被關閉在退出之前正常關閉套接字。這包括調用Socket.Shutdown(SocketShutdown.Send),然後等待接收操作返回字節計數0(表示遠程客戶端也已關閉)。

這將確保及時關閉連接。否則,另一個未關閉的玩家將無法知道連接丟失,直到他們嘗試發送一些數據。

相關問題