我正在使用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();
}
}