客户端/服务器程序不发送/接收整数

时间:2018-06-12 23:36:54

标签: java client-server

我正在使用TCP协议制作战舰游戏的简单控制台版本。我的问题是,在进入while(battleBoardClient.play)循环后,客户端和服务器之间没有通信,也许服务器端代码搞砸了。程序不读取即将到来的整数,也不会将它们发送到服务器或两者。我想要一些指示,我应该在哪里寻找错误。以下是客户端版本。

{
 public static int port = 12347;
 public static BufferedReader con_br = new BufferedReader(newInputStreamReader(System.in));

public static void main(String[] args)throws IOException
{
    //BattleBoard battleBoardServer = new BattleBoard();
    BattleBoard battleBoardClient = new BattleBoard();
    Scanner in = new Scanner(System.in);
    System.out.print("Podaj adres serwera: ");
    String address = con_br.readLine();
    Socket sock = new Socket(address, port);
    BufferedReader sock_br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    PrintWriter sock_pw = new PrintWriter(sock.getOutputStream(), false);
    System.out.println("Nawiązano połączenie.");

    Thread chat_client_writer = new ChatWriter("chat_client_writer", sock_pw, con_br);
    chat_client_writer.start();
    boolean correctDirection,correctRow=false,correctColumn=false,correctField=false;
    int serverHitResponse;
    String s;
    while((s = sock_br.readLine()) != null)
    {
        if(s.contains("tak")){
            battleBoardClient.initBattleBoard();
            ((ChatWriter) chat_client_writer).setSuspended(true);
            while(battleBoardClient.shipCounter<6)//dodawn1atkow dla klienta
               {
                   battleBoardClient.drawOwnBoard();
                   System.out.println("Podaj kierunek(N=0,S=1,W=2,E=3)");

                   int a = in.nextInt();


                   if(a==0 || a == 1 || a==2 || a ==3)
                    {
                        correctDirection = true;
                    }
                   else
                    {
                       correctDirection = false;
                       System.out.println("Źle wybrany kierunek");
                       while(!correctDirection)
                       {
                           System.out.println("Podaj kierunek(N=0,S=1,W=2,E=3)");
                           a = in.nextInt();
                           if(a==0 || a == 1 || a==2 || a ==3)
                            {
                                correctDirection = true;
                            }
                       }
                    }  
                   System.out.println("Podaj początkowy rząd");
                   int b = in.nextInt();

                   System.out.println("Podaj początkową kolumnę");
                   int c = in.nextInt();
                   battleBoardClient.addShip(a,battleBoardClient.shipCounter, b, c);
                   battleBoardClient.shipCounter++;
               }//koniec dodawania statkow
            while(battleBoardClient.play)//ta petla sie wykonuje dopoki trwa gra UWAGA TO MOZE NA RAZIE NIE DZIALAC
            {
                int a=0,b=0,c=0,d=0,ready=-1,ready2=0;
                //serwer zaczyna wiec najpierw czekamy na jego strzal

                while(sock_br.ready())
                {
                    continue;
                }
                c = sock_br.read();//czytamy rzad
                while(sock_br.ready())
                {
                    continue;
                }
                d = sock_br.read();//czytamy kolumne
                battleBoardClient.getHit(c, d);//aktualizujemy nasza plansze 
                sock_pw.print(battleBoardClient.response);//wysylamy informacje czy trafil, 1 jesli tak, 0 jesli nie
                sock_pw.flush();
                battleBoardClient.drawBattleBoards();//rysujemy OBIE plansze
                System.out.println("Twoja tura. Podaj współrzędne.");//ZACZYNA SIE TURA KLIENTA
                while(!correctField)//sprawdzenie czy wybrane pole nie bylo juz wczesniej ostrzelane
                {
                    while(!correctRow)//sprawdzenie poprawnosci wpisanego rzedu
                    {
                        System.out.println("Podaj rząd");

                            if(in.hasNextInt())
                            {
                                a = in.nextInt();
                            }
                            else
                            {
                                System.out.println("Podałeś niewłaściwą liczbę, spróbuj ponownie");
                                in.next();
                                continue;
                            }
                            if(a<0 || a>9)
                            {
                                System.out.println("Podałeś niewłaściwą liczbę.Spróbuj ponownie");

                            }
                            else
                            {
                                correctRow = true;
                            }   
                    }
                    while(!correctColumn)//sprawdzenie poprawnosci kolumny
                    {
                        System.out.println("Podaj kolumnę");
                        if(in.hasNextInt())
                        {
                            b = in.nextInt();
                        }
                        else
                        {
                            System.out.println("Podałeś niewłaściwą liczbę, spróbuj ponownie");
                            in.next();
                            continue;
                        }
                        if(b<0 || b>9)
                        {
                            System.out.println("Podałeś niewłaściwą liczbę.Spróbuj ponownie");

                        }
                        else
                        {
                            correctRow = true;
                        }

                    }
                    if(battleBoardClient.enemyBoard[a][b]=='*' || battleBoardClient.enemyBoard[a][b]=='X')
                    {
                        System.out.println("To pole było już ostrzelane, wybierz inne.");
                    }
                    else
                    {
                        correctField = true;
                    }
                }//koniec sprawdzania poprawnosci podanego pola

                sock_pw.print(a);//wysylamy serwerowi rzad
                sock_pw.flush();
                sock_pw.print(b);//kolumne
                sock_pw.flush();
                while(sock_br.ready())
                {
                    continue;
                }
                serverHitResponse = sock_br.read();//czekamy na odpowiedz czy bylo trafienie
                battleBoardClient.strikeEnemyBoard(a, b, serverHitResponse); // aktualizujemy lokalna plansze serwera
                //i od nowa lecimy

            }

            battleBoardClient.shipCounter = 0;
            battleBoardClient.ready=true;
            ((ChatWriter) chat_client_writer).setSuspended(false);
        }
        System.out.println("\rserver: " + s);
        if(battleBoardClient.ready==true)  battleBoardClient.drawBattleBoards();
    }
    sock.close();
}
 }

服务器版本

class TCPSerwer
     {
public static int port = 12347;
public static BufferedReader con_br = new BufferedReader(new InputStreamReader(System.in));

@SuppressWarnings("deprecation")
public static void main(String[] args)throws IOException
{
    BattleBoard battleBoardServer = new BattleBoard();
    //BattleBoard battleBoardClient = new BattleBoard();
    ServerSocket ssock = new ServerSocket(port);
    Scanner in = new Scanner(System.in);
    System.out.println("<Serwer>: Oczekiwanie na połączenie.");
    Socket csock = ssock.accept();
    System.out.println("<Serwer>: Nawiązano połączenie.");

    BufferedReader csock_br = new BufferedReader(new InputStreamReader(csock.getInputStream()));
    PrintWriter csock_pw = new PrintWriter(csock.getOutputStream(), false);

    Thread chat_server_writer = new ChatWriter("chat_server_writer", csock_pw, con_br);
    chat_server_writer.start();
    csock_pw.println("Napisz: \"END\" by zakończyć połączenie.");
    csock_pw.flush();
    csock_pw.println("Czy chcesz rozpocząć rozgrywkę?");
    csock_pw.flush();
    String s;
    boolean correctDirection,correctRow=false,correctColumn=false,correctField=false;
    int clientHitResponse;
    while((s = csock_br.readLine()) != null)
    {
        if(s.contains("tak")){
            csock_pw.println("tak");
            csock_pw.flush();
            ((ChatWriter) chat_server_writer).setSuspended(true);
            while(battleBoardServer.shipCounter<6)//dodawn1atkow dla serwera
               {
                battleBoardServer.drawOwnBoard();
               System.out.println("Podaj kierunek(N=0,S=1,W=2,E=3)");

               int a = in.nextInt();


                   if(a==0 || a == 1 || a==2 || a ==3)
                    {
                        correctDirection = true;
                    }
                   else
                    {
                       correctDirection = false;
                       System.out.println("Źle wybrany kierunek");
                       while(!correctDirection)
                       {
                           System.out.println("Podaj kierunek(N=0,S=1,W=2,E=3)");
                           a = in.nextInt();
                           if(a==0 || a == 1 || a==2 || a ==3)
                            {
                                correctDirection = true;
                            }
                       }
                    }  
                   System.out.println("Podaj początkowy rząd");
                   int b = in.nextInt();

                   System.out.println("Podaj początkową kolumnę");
                   int c = in.nextInt();
                   battleBoardServer.addShip(a,battleBoardServer.shipCounter, b, c);
                   battleBoardServer.shipCounter++;
               }
            while(battleBoardServer.play)//ta petla sie wykonuje dopoki trwa gra
            {
                int a=0,b=0,c=0,d=0,ready=0,ready2=0;
                battleBoardServer.drawBattleBoards();//rysujemy OBIE plansze
                System.out.println("Twoja tura. Podaj współrzędne.");
                while(!correctField)//sprawdzenie czy wybrane pole nie bylo juz wczesniej ostrzelane
                {
                    while(!correctRow)//sprawdzenie poprawnosci wpisanego rzedu
                    {
                        System.out.println("Podaj rząd");

                            if(in.hasNextInt())
                            {
                                a = in.nextInt();
                            }
                            else
                            {
                                System.out.println("Podałeś niewłaściwą liczbę, spróbuj ponownie");
                                in.next();
                                continue;
                            }
                            if(a<0 || a>9)
                            {
                                System.out.println("Podałeś niewłaściwą liczbę.Spróbuj ponownie");

                            }
                            else
                            {
                                correctRow = true;
                            }   
                    }
                    while(!correctColumn)//sprawdzenie poprawnosci kolumny
                    {
                        System.out.println("Podaj kolumnę");
                        if(in.hasNextInt())
                        {
                            b = in.nextInt();
                        }
                        else
                        {
                            System.out.println("Podałeś niewłaściwą liczbę, spróbuj ponownie");
                            in.next();
                            continue;
                        }
                        if(b<0 || b>9)
                        {
                            System.out.println("Podałeś niewłaściwą liczbę.Spróbuj ponownie");

                        }
                        else
                        {
                            correctColumn = true;
                        }

                    }
                    if(battleBoardServer.enemyBoard[a][b]=='*' || battleBoardServer.enemyBoard[a][b]=='X')
                    {
                        System.out.println("To pole było już ostrzelane, wybierz inne.");
                    }
                    else
                    {
                        correctField = true;
                    }
                }//koniec sprawdzania poprawnosci podanego pola UWAGA OD NASTEPNEJ LINIJKI MOZE NIE DZIALAC
                csock_pw.print(a);//wysylanie wspolrzednych uderzenia do klienta
                csock_pw.flush();
                csock_pw.print(b);
                csock_pw.flush();
                //DataOutputStream.
                //Oczekiwanie na odpowiedz klienta, czy uderzenie trafilo
                while(csock_br.ready())
                {
                    continue;
                }
                clientHitResponse = csock_br.read();
                battleBoardServer.strikeEnemyBoard(a, b, clientHitResponse);//akutalizacja lokalnej planszy klienta
                //START TURY KLIENTA
                //OCZEKIWANIE NA JEGO STRZAL

                while(csock_br.ready())
                {
                    continue;
                }
                c=csock_br.read();//zczytanie rzedu
                while(csock_br.ready())
                {
                    continue;
                }
                d=csock_br.read();//zczytanie kolumny


                battleBoardServer.getHit(c, d);//aktualizacja lokalnej planszy serwera
                csock_pw.print(battleBoardServer.response);//wyslanie odpowiedzi o trafieniu do klienta

            }
            battleBoardServer.ready=true;
            ((ChatWriter) chat_server_writer).setSuspended(false);
        }
        System.out.println("\rclient: " + s);
        System.out.print("> ");
        if(battleBoardServer.ready==true)  battleBoardServer.drawBattleBoards();
    }
    System.out.println("\rserver: Client has disconnected");
    csock.close();
    ssock.close();
}
}

0 个答案:

没有答案