diff --git a/TicTacToe/Program.cs b/TicTacToe/Program.cs index 73bfed1..51c6347 100644 --- a/TicTacToe/Program.cs +++ b/TicTacToe/Program.cs @@ -22,6 +22,7 @@ namespace TicTacToe Console.WriteLine("[C]onfig Players"); //Console.WriteLine("[N]ew Game"); Console.WriteLine("[S]tart Game"); + Console.WriteLine("[O] Start Online Game"); Console.WriteLine("[E]nd"); char input = GetCharInput(new[] { 'c', 's', 'e', 'n', 'o' }); @@ -47,19 +48,7 @@ namespace TicTacToe ticTacToe = new TicTacToe(); break; case 'o': - string hosting = Console.ReadLine(); - var test = new TicTacToeOnline(); - if (hosting == "t") - { - test.IsServer(true); - } - else - { - test.IsServer(false); - } - - test.StartGame(); - + StartOnlineGame(); break; } @@ -68,6 +57,30 @@ namespace TicTacToe } } + private static void StartOnlineGame() + { + Console.Clear(); + var ticTacToeOnline = new TicTacToeOnline(); + Console.WriteLine("Is this PC Hosting?"); + Console.WriteLine("[Y]es"); + Console.WriteLine("[N]o"); + string hosting = Console.ReadLine(); + + if (hosting.ToLower() == "y") + { + ticTacToeOnline.IsServer(true); + } + else + { + ticTacToeOnline.IsServer(false); + Console.WriteLine("On which IP Address should be connected?"); + string ip = Console.ReadLine(); + ticTacToeOnline.SetIpAddress(ip); + } + + ticTacToeOnline.StartGame(); + } + private static void ConfigPlayers(TicTacToe ticTacToe) { diff --git a/TicTacToe/TicTacToe.cs b/TicTacToe/TicTacToe.cs index d7073d7..34c76ea 100644 --- a/TicTacToe/TicTacToe.cs +++ b/TicTacToe/TicTacToe.cs @@ -63,7 +63,7 @@ namespace TicTacToe } //Do CleanUp for every Player (Mostly needed for LearningAi to update the brain) - private void CleanUp() + protected virtual void CleanUp() { foreach (var player in Players) { diff --git a/TicTacToe/TicTacToeOnline.cs b/TicTacToe/TicTacToeOnline.cs index c8ee594..348e95a 100644 --- a/TicTacToe/TicTacToeOnline.cs +++ b/TicTacToe/TicTacToeOnline.cs @@ -12,8 +12,10 @@ namespace TicTacToe private bool _isServer = false; private int _port = 6969; private string _ipAddress = "127.0.0.1"; - private Socket _client; - + private NetworkStream _stream; + private TcpClient _client; + private TcpListener _listener; + private int _clientPlayerId = -1; public override void AddPlayer(Player player) @@ -27,7 +29,26 @@ namespace TicTacToe { _isServer = x; } + + public void SetIpAddress(string ip) + { + _ipAddress = ip; + } + protected override void CleanUp() + { + foreach (var player in Players) + { + player.CleanUp(); + } + + _client.Close(); + if (_isServer) + { + _listener.Stop(); + } + } + public override void StartGame() { if (_isServer) @@ -86,45 +107,27 @@ namespace TicTacToe private void SendData(string data) { - data += ""; - Console.WriteLine("Sending Data: " + data); - byte[] bytes = Encoding.ASCII.GetBytes(data); - _client.Send(bytes); + Console.WriteLine("Sending data"); + Console.WriteLine("Data: " + data); + byte[] bytes = Encoding.UTF8.GetBytes(data); + _stream.Write(bytes, 0, bytes.Length); } private string ReceiveData() { - string data = null; - byte[] bytes = null; - Console.WriteLine("Receiving Data"); - - while (true) - { - bytes = new byte[1024]; - int bytesRec = _client.Receive(bytes); - data += Encoding.UTF8.GetString(bytes, 0, bytesRec); - Console.WriteLine("Data: " + data); - if (data.IndexOf("") > -1) - { - break; - } - } - - Console.WriteLine("Data Received, returning"); - + byte[] bytes = new byte[_client.ReceiveBufferSize]; + int bytesRead = _stream.Read(bytes, 0, _client.ReceiveBufferSize); + + string data = Encoding.UTF8.GetString(bytes); + Console.WriteLine("Data: " + data); return data; } private void ConnectToServer() { - IPHostEntry host = Dns.GetHostEntry(_ipAddress); - IPAddress ipAddress = host.AddressList[0]; - IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, _port); - - _client = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - - _client.Connect(remoteEndPoint); + _client = new TcpClient(_ipAddress, _port); + _stream = _client.GetStream(); Console.WriteLine("connected"); @@ -143,17 +146,14 @@ namespace TicTacToe private void StartServer() { - IPHostEntry host = Dns.GetHostEntry(_ipAddress); - IPAddress ipAddress = host.AddressList[0]; - IPEndPoint localEndPoint = new IPEndPoint(ipAddress, _port); - Socket server = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - server.Bind(localEndPoint); - server.Listen(1); - - _client = server.Accept(); - + _listener = new TcpListener(IPAddress.Any, _port); + _listener.Start(); + + _client = _listener.AcceptTcpClient(); Console.WriteLine("A Client connected"); + _stream = _client.GetStream(); + var player = new HumanPlayer("Server", FieldState.PlayerX); AddPlayer(player);