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