2015-08-03 6 views
-1

Привет, я пытаюсь создать java-игру. Прямо сейчас я на серверной части. Прямо сейчас вывод состоит в том, что он просто freze и не будет завершен. Я пробовал использовать wirehark, но я не пошел хорошо.Java - Сокеты, приложение не отвечает

Извините за мой английский.

Сервер:

while(acceptingSockets){ 
     if(playersOnline != maxPlayers){ 
      playersOnline = playersOnline + 1; 
     socket = ss.accept(); 
     brr = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));      
     bw.write("ACCEPTED"); 
     bw.newLine(); 
     bw.flush(); 
     }else{ 
     bw.write("DENIED"); 
     bw.flush(); 
    } 

     while (acceptingConnections) { 
      while ((brr.readLine()) != null) { 
       String line = brr.readLine(); 
      if(line.equalsIgnoreCase("CONNECTED")){ 
       bw.write("MAP-" + mapId); 
       bw.newLine(); 
       bw.write("NEWMAP"); 
       bw.newLine(); 
       bw.write("CONNECTED"); 
       bw.newLine(); 
       bw.flush(); 
       brr.close(); 
       bw.close(); 
       socket.close(); 
      } 
      } 
     } 

Клиент:

 public void actionPerformed(ActionEvent e) 
      { 
      prep = true; 
      start.setEnabled(false); 
      start.setText("Connecting"); 
      try { 
       socket = new Socket(Display.Ip, Display.port); 
       PrintStream ps = new PrintStream(socket.getOutputStream()); 
       InputStreamReader ir = new InputStreamReader(socket.getInputStream()); 
       BufferedReader br = new BufferedReader(ir); 
       String line; 
       while(prep){ 
        while((line = br.readLine()) != null){ 
         if(line.equalsIgnoreCase("ACCEPTED")){ 
          ps.println("CONNECTED"); 
         } 
         if(line.equalsIgnoreCase("CONNECTED")){ 
          new Display(); 
          dispose(); 
          br.close(); 
          ps.close(); 
          socket.close(); 
          prep = false; 
         } 
         if(line.equalsIgnoreCase("NEWMAP")){ 
          Display.newMap = true; 
         } 
         if(line.startsWith("MAP-")){ 
          String newLine = line.replace("MAP-", ""); 
          Display.mapId = Integer.valueOf(newLine); 
         } 
        } 
       } 

      } catch (IOException e1) { 
       e1.printStackTrace(); 
       new Message("No Server Found!", "The servers are offline!.", MessageType.WARNING); 
       start.setText("Connect"); 
       start.setEnabled(true); 
       prep = false; 
        } 
      }}); 
+0

ваша ошибка трассировки – SSH

+0

я не получаю никаких ошибок, я добавил printStackrace на стороне клиента, и он все равно woudnl't вставьте любые ошибки. А на сервере же, нет ошибки – Kalkonen

+0

Где вы переключили логическое значение 'acceptingSockets' и' acceptingConnections'? – MrT

ответ

0

Вызов 'bw.newLine() после отправки текста, например. «ACCEPTED» с сервера, иначе клиент readLine() не вернется.

+0

Обновлен мой код, по-прежнему не работает. – Kalkonen

+0

WTF? Что вы имеете в виду, «не работает». Когда вы запускаете код клиента и сервера под своим отладчиком, где он задерживается/поднимает exeception/loop/order pizza/whatso Sod this, downvote и close-vote as off-topic 'cos no debug info :( –

+0

Не работает, я имею в виду ту же проблему, что и раньше. Он не читает даже первое сообщение (ACCEPTRED) – Kalkonen

0
  1. Вы читаете строки, но не записываете строки. Вам нужно отправить терминатор линии.

  2. Вы звоните readLine() слишком много раз. Если результат не соответствует тому, что вы сравниваете с каждым раз, вы просто отбрасываете его. Вы должны вызывать только один раз в итерации цикла, в состоянии while, таким образом:

    String line; 
    while ((line = br.readLine()) != null) 
    { 
        // ... 
    } 
    
+0

На 2., Вы имеете в виду, как String line = br.readLine() ;? – Kalkonen

+0

Обновлен код. все еще не работает. – Kalkonen

Смежные вопросы