Beispiel #1
0
        public void ConnectingToServer(string host, int port, Player player)
        {
            var game    = new Game();
            var counter = 0;

            using (var client = new TcpClient(host, port))
                using (var networkStream = client.GetStream())
                    using (StreamReader reader = new StreamReader(networkStream, Encoding.UTF8))
                        using (var writer = new StreamWriter(networkStream, Encoding.UTF8)
                        {
                            AutoFlush = true
                        })
                        {
                            Console.WriteLine($"Ansluten till {client.Client.RemoteEndPoint}");
                            while (client.Connected)
                            {
                                if (counter == 0)
                                {
                                    var line = reader.ReadLine();
                                    if (!line.Contains("210"))
                                    {
                                        writer.WriteLine("501 Sequence Error");
                                        Console.WriteLine("501 Sequence Error");
                                        client.Dispose();
                                        break;
                                    }
                                    else
                                    {
                                        Console.WriteLine($"Svar: {line}");
                                        counter = 1;
                                    }
                                }

                                var data = networkStream.DataAvailable;
                                if (!data)
                                {
                                    Console.WriteLine("Ange text att skicka: (Skriv QUIT för att avsluta)");
                                    var text = Console.ReadLine();

                                    // Skicka text
                                    writer.WriteLine(text);
                                }



                                if (!client.Connected)
                                {
                                    break;
                                }

                                // Läs minst en rad
                                do
                                {
                                    var line = reader.ReadLine();
                                    if (line.Contains("270"))
                                    {
                                        client.Dispose();
                                        break;
                                    }
                                    if (line.Contains("222"))
                                    {
                                        Console.WriteLine(line);
                                        line = reader.ReadLine();
                                        Console.WriteLine(line);
                                    }

                                    if (line.Contains("220"))
                                    {
                                        var commands = line.Split(" ");
                                        player.Opponent = commands[1];
                                    }

                                    if (line.Contains("500"))
                                    {
                                        var text = Console.ReadLine();

                                        // Skicka text
                                        writer.WriteLine(text);
                                    }
                                    if (line.Contains("Fire", StringComparison.InvariantCultureIgnoreCase))
                                    {
                                        Console.WriteLine(player.Opponent + " tur");
                                        var answer   = "";
                                        var commands = line.Split(" ");
                                        while (commands.Length < 2)
                                        {
                                            Console.WriteLine("500 Syntax Error");
                                            writer.WriteLine("500 Syntax Error");
                                            reader.ReadLine();
                                            line     = Console.ReadLine();
                                            commands = line.Split(" ");
                                        }

                                        if (commands.Length >= 2)
                                        {
                                            var IsOnBoard = game.CheckCoordinateOnBoard(commands[1]);

                                            while (!IsOnBoard)
                                            {
                                                Console.WriteLine("500 Syntax Error");
                                                writer.WriteLine("500 Syntax Error");
                                                line      = reader.ReadLine();
                                                commands  = line.Split(" ");
                                                IsOnBoard = game.CheckCoordinateOnBoard(commands[1]);
                                            }
                                            answer = game.ExecuteFireCommand(line, player);
                                        }

                                        writer.WriteLine(answer);
                                        Console.WriteLine(answer);
                                        Console.WriteLine(player.Name + " tur");
                                    }
                                    else
                                    {
                                        Console.WriteLine($"Svar: {line}");
                                    }
                                } while (networkStream.DataAvailable);
                            }
                            ;
                        }
        }
        public void StartListening(int port, Player player)
        {
            var game        = new Game();
            var greeting    = false;
            var startedGame = false;

            try
            {
                listener = new TcpListener(IPAddress.Any, port);
                listener.Start();
                Console.WriteLine($"Starts listening on port: {port}");

                while (true)
                {
                    Console.WriteLine("Väntar på att någon ska ansluta sig...");

                    using (var client = listener.AcceptTcpClient())
                        using (var networkStream = client.GetStream())
                            using (StreamReader reader = new StreamReader(networkStream, Encoding.UTF8))
                                using (var writer = new StreamWriter(networkStream, Encoding.UTF8)
                                {
                                    AutoFlush = true
                                })
                                {
                                    Console.WriteLine($"Klient har anslutit sig {client.Client.RemoteEndPoint}!");
                                    writer.WriteLine("210 BATTLESHIP/1.0");
                                    Console.WriteLine("210 BATTLESHIP/1.0");

                                    while (client.Connected)
                                    {
                                        var command = reader.ReadLine();
                                        Console.WriteLine($"Mottaget: {command}");

                                        if (!greeting && command.Contains("HELO", StringComparison.InvariantCultureIgnoreCase) || command.Contains("HELLO", StringComparison.InvariantCultureIgnoreCase))
                                        {
                                            var commands = command.Split(" ");
                                            if (commands.Length == 1)
                                            {
                                                writer.WriteLine("500 Syntax Error");
                                            }
                                            else
                                            {
                                                player.Opponent = commands[1];
                                                Console.WriteLine("220 " + player.Name);
                                                writer.WriteLine("220 " + player.Name);
                                                greeting = true;
                                            }
                                        }

                                        else if (string.Equals(command, "QUIT", StringComparison.InvariantCultureIgnoreCase))
                                        {
                                            writer.WriteLine("270 BYE BYE");
                                            break;
                                        }

                                        else if (greeting && !startedGame && string.Equals(command, "START", StringComparison.InvariantCultureIgnoreCase))
                                        {
                                            var rnd         = new Random();
                                            var startPlayer = rnd.Next(0, 2) == 0;
                                            if (startPlayer)
                                            {
                                                writer.WriteLine("222 Host Starts");
                                                Console.WriteLine("222 Host Starts");
                                                var line = Console.ReadLine();
                                                writer.WriteLine(line);
                                            }
                                            else
                                            {
                                                writer.WriteLine("221 Client Starts");
                                                Console.WriteLine("221 Client Starts");
                                            }
                                            startedGame = true;
                                        }


                                        else if (greeting && startedGame)
                                        {
                                            if (string.Equals(command, "HELP", StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                var helpText = "First command before game starts : HELO <SP> <playername> <CRLF> ";
                                                helpText += "Start game : START <CRLF> ";
                                                helpText += "Fire : FIRE <SP> <coordinate> [ <SP> <message> ] <CRLF> ";
                                                helpText += "Quit game : QUIT <CRLF>";
                                                writer.WriteLine(helpText);

                                                //break;
                                            }

                                            else if (command.Contains("FIRE", StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                var answer   = "";
                                                var commands = command.Split(" ");
                                                while (commands.Length < 2)
                                                {
                                                    Console.WriteLine("500 Syntax Error");
                                                    writer.WriteLine("500 Syntax Error");
                                                    command  = reader.ReadLine();
                                                    commands = command.Split(" ");
                                                }

                                                if (commands.Length >= 2)
                                                {
                                                    var IsOnBoard = game.CheckCoordinateOnBoard(commands[1]);

                                                    while (!IsOnBoard)
                                                    {
                                                        Console.WriteLine("500 Syntax Error");
                                                        writer.WriteLine("500 Syntax Error");
                                                        command   = reader.ReadLine();
                                                        commands  = command.Split(" ");
                                                        IsOnBoard = game.CheckCoordinateOnBoard(commands[1]);
                                                    }
                                                    answer = game.ExecuteFireCommand(command, player);
                                                }

                                                //writer.WriteLine(answer);
                                                Console.WriteLine(answer);
                                                if (answer.Contains("260"))
                                                {
                                                    writer.WriteLine(answer);
                                                }
                                                else
                                                {
                                                    Console.WriteLine($"{player.Name}'s turn");
                                                    var text = Console.ReadLine();

                                                    // Skicka text
                                                    writer.WriteLine(answer);
                                                    writer.WriteLine(text);
                                                }
                                            }

                                            else if (command.Contains("24"))
                                            {
                                            }

                                            else if (command.Contains("500"))
                                            {
                                                var text = Console.ReadLine();

                                                // Skicka text
                                                writer.WriteLine(text);
                                            }
                                            else
                                            {
                                                writer.WriteLine($"UNKNOWN COMMAND: {command}");
                                            }
                                        }

                                        else if (command.Contains("501", StringComparison.InvariantCultureIgnoreCase))
                                        {
                                            break;
                                        }

                                        else
                                        {
                                            writer.WriteLine($"500 syntax error: {command}");
                                        }
                                    }
                                }
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine("Misslyckades att öppna socket. Troligtvis upptagen.");
                Environment.Exit(1);
            }
        }