public void Disconnect() { if (!Mode) { if (ClientsPool.ContainsKey(EnemyPoint.ToString())) { SendMessage(ClientsPool[EnemyPoint.ToString()].GetStream(), MessageCode.Fin); ClientsPool[EnemyPoint.ToString()].Close(); } } }
//by invoking this method server sends Playaccept message, to confirm players choose public void SelectPlayer(IPEndPoint player) { if (ClientsPool.ContainsKey(player.ToString())) { EnemyPoint = player; SendMessage(ClientsPool[EnemyPoint.ToString()].GetStream(), MessageCode.PlayAccept); } else { throw new FailedToConnectException("Хост с таким адресом недоступен, похоже он отключился"); } }
private void ClearWatingList() { //clears all waiting users except the choosen one Dictionary <string, TcpClient> .KeyCollection Keys = ClientsPool.Keys; foreach (string key in Keys) { if (key != EnemyPoint.ToString()) { ClientsPool.Remove(key); } } }
private void ClientOnTryConnect(IAsyncResult res) { try { TcpListener Server = res.AsyncState as TcpListener; TcpClient NewHost = Server.EndAcceptTcpClient(res); string key = ((IPEndPoint)NewHost.Client.RemoteEndPoint).ToString(); if (!ClientsPool.ContainsKey(key)) { Thread Handler = new Thread(new ParameterizedThreadStart(MaintainConnection)); ClientsPool.Add(key, NewHost); Handler.Start(NewHost); } Server.BeginAcceptTcpClient(new AsyncCallback(ClientOnTryConnect), Server); } catch (ObjectDisposedException) { return; } }
public void Connect(IPEndPoint Opponent) { //will be called when player 2 wants to connect to the host //method will add player to pool, and elicit select player TcpClient NewPlayer = new TcpClient(LocalPoint); try { NewPlayer.Connect(Opponent); Mode = false; ClientsPool.Add(Opponent.ToString(), NewPlayer); EnemyPoint = Opponent; Thread Handler = new Thread(new ParameterizedThreadStart(MaintainConnection)); Handler.Start(NewPlayer); SendMessage(NewPlayer.GetStream(), MessageCode.PlayRequest); } catch (SocketException err) { throw new FailedToConnectException("Невозможно подключиться к серверу"); } }