2014-10-31 242 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(表示远程客户端也已关闭)。

这将确保及时关闭连接。否则,另一个未关闭的玩家将无法知道连接丢失,直到他们尝试发送一些数据。

相关问题