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();
}
}
定義「即刻」。計算機無法立即做任何事情,只有你或我無法做到。根據網絡連接的不同,套接字的優雅關閉可能會非常快速地發生。重置(丟失連接)可能會或可能不會被快速檢測到,具體取決於發生了什麼。你應該對你問的問題更具體。 – 2014-10-31 19:51:55
假設player1必須點擊一個按鈕,然後player2按鈕被禁用。如果我關閉player1,我怎麼能檢測到我關閉它(它等待player2點擊一個按鈕,但player2按鈕被禁用)。如果我想關閉player2,當我點擊player1時,我在控制檯上看到一條消息(播放器2 disconnectctetc) – user3645080 2014-10-31 19:54:55
是否有一行代碼會導致上述示例中的問題? – 2014-10-31 20:13:14