2016-10-26 8 views
1

これまでのサーバークライアントアプリケーションは完全に動作していました。それから突然、私はそれを実行することを決めたときに(最初にサーバーとクライアント)、サーバーウィンドウは、クライアントウィンドウを開いて2秒後に閉じました。これで、クライアントウィンドウだけが開いたままになりました。ただし、javaw.exeプロセス(そのうちの2つ、サーバーとクライアント)は停止しません。それらはゲームで使用したポート番号に引っ掛けられます。したがって、JVM_Bind例外が再び実行されると、例外が発生します。クライアント側が開くとすぐにサーバー側が閉じられる

私は両方のプロセスを終了し、アプリケーションを再実行しましたが、同じ問題が発生します。私はポート番号を変更しただけでも(もちろん両方のプロジェクトで)、同じ結果が得られました。

サーバーとクライアントは、マルチプレイヤーゲームのように自動的に物事を送受信し続けます。

クライアント側:(理想的には)第60回

private void tick() { 
    String info = handler.getPlayer(0).getX() + " " + handler.getPlayer(0).getY() + " " + handler.hb2.width + " " + handler.getPlayer(0).h1.x + " " + handler.getPlayer(0).h1.y + " " + handler.getPlayer(0).h2.x + " " + handler.getPlayer(0).h2.y + handler.getPlayer(0).h1.punch + " " + handler.getPlayer(0).h2.punch; 
    sendMessage(info); 
    String infoR = ""; 
    try { 
     infoR = br.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Scanner s = new Scanner(infoR); 
    int a = 0; 
    while(s.hasNext()) { 
     String poop = s.next(); 
     a++; 
     try { 
      switch(a) { 
      case 1: 
       handler.getPlayer(1).x = Integer.parseInt(poop); 
       break; 
      case 2: 
       handler.getPlayer(1).y = Integer.parseInt(poop); 
       break; 
      case 3: 
       handler.hb1.width = Integer.parseInt(poop); 
       break; 
      case 4: 
       handler.getPlayer(1).h1.x = Integer.parseInt(poop); 
       break; 
      case 5: 
       handler.getPlayer(1).h1.y = Integer.parseInt(poop); 
       break; 
      case 6: 
       handler.getPlayer(1).h2.x = Integer.parseInt(poop); 
       break; 
      case 7: 
       handler.getPlayer(1).h2.y = Integer.parseInt(poop); 
       break; 
      case 8: 
       handler.getPlayer(1).h1.punch = Boolean.getBoolean(poop); 
       break; 
      case 9: 
       handler.getPlayer(1).h2.punch = Boolean.getBoolean(poop); 
       break; 
      } 
     } catch(NumberFormatException e) { 
      frame.setVisible(false); 
      poop += " " + s.next(); 
      if(poop.equals("you lose")) new ResultDisplay("red"); 
      handler.hb1.resultDisplayed = true; 
      stop(); 
     } 
    } 
    handler.tick(); 
} 

public void sendMessage(String message) { 
    pw.println(message); 
    pw.flush(); 
} 

private void init() { 
    try { 
     sock = new Socket("127.0.127.1", 1111); 
     ostream = sock.getOutputStream(); 
     pw = new PrintWriter(ostream); 
     istream = sock.getInputStream();; 
     br = new BufferedReader(new InputStreamReader(istream)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // more game initialization code follows 

init()が最初に呼び出され、その後tick()メソッドが呼び出されます。

サーバー側:

private void tick() { 
    String info = handler.getPlayer(1).getX() + " " + handler.getPlayer(1).getY() + " " + handler.hb1.width + " " + handler.getPlayer(1).h1.x + " " + handler.getPlayer(1).h1.y + " " + handler.getPlayer(1).h2.x + " " + handler.getPlayer(1).h2.y + " " + handler.getPlayer(1).h1.punch + " " + handler.getPlayer(1).h2.punch; 
    String infoR = ""; 
    try { 
     infoR = br.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Scanner s = new Scanner(infoR); 
    int a = 0; 
    while(s.hasNext()) { 
     a++; 
     String poop = s.next(); 
     try { 
      switch(a) { 
      case 1: 
       handler.getPlayer(0).x = Integer.parseInt(poop); 
       break; 
      case 2: 
       handler.getPlayer(0).y = Integer.parseInt(poop); 
       break; 
      case 3: 
       handler.hb2.width = Integer.parseInt(poop); 
       break; 
      case 4: 
       handler.getPlayer(0).h1.x = Integer.parseInt(poop); 
       break; 
      case 5: 
       handler.getPlayer(0).h1.y = Integer.parseInt(poop); 
       break; 
      case 6: 
       handler.getPlayer(0).h2.x = Integer.parseInt(poop); 
       break; 
      case 7: 
       handler.getPlayer(0).h2.y = Integer.parseInt(poop); 
       break; 
      case 8: 
       handler.getPlayer(0).h1.punch = Boolean.getBoolean(poop); 
       break; 
      case 9: 
       handler.getPlayer(0).h2.punch = Boolean.getBoolean(poop); 
       break; 
      } 
     }catch(NumberFormatException e) { 
      frame.setVisible(false); 
      poop += " " + s.next(); 
      if(poop.equals("you lose")) new ResultDisplay("green"); 
      handler.hb2.resultDisplayed = true; 
      stop(); 
     } 
    } 
    sendMessage(info); 
    handler.tick(); 
} 

public void sendMessage(String message) { 
    pw.println(message); 
    pw.flush(); 
} 

private void init() { 
    try { 
     sersock = new ServerSocket(1111); 
     sock = sersock.accept(); 
     br = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
     pw = new PrintWriter(sock.getOutputStream()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // more game initialization code follows 

ゲームのメインスレッドがinit()tick()サーバー上のスイッチの周りにあなたのtryおよびcatchで両方のプロジェクト

+2

私たちがコードなしで答える方法はありません。そしてあなたの完全なアプリケーションではなく、それが[mcve]であることを確認してください。そうすれば、自分たちでテストすることができます。 – RealSkeptic

+0

私はいくつかの例外が発生しなければならないと思います。だから、それらを記録して、それらにも質問を加えてください。上記のコメントに記載されているいくつかのコード例も歓迎します。 – mike

+0

例外は一度もなく、JVMは2回目に例外をバインドします。私は余分なコードを追加しました –

答えて

1

におけるメイン遊技スレッドによって呼び出され、両方を呼び出します実際にフレームの可視性をfalseに設定して例外を処理し、例外を出力しないため、例外が発生しない理由が説明されます。もちろん

}catch(NumberFormatException e) { 
    frame.setVisible(false); //<-- This bit 
    poop += " " + s.next(); 
    if(poop.equals("you lose")) new ResultDisplay("green"); 
    handler.hb2.resultDisplayed = true; 
    stop(); 
} 

あなたはそれが理由でキャッチし、多分あなたはそれがスロー例外をプリントアウトしてフレームを隠すべきではないのですか?あなたが投げたくないものを投げているかもしれません。

+0

あなたは正しいです!これはスローされる例外です! –

+0

メッセージの受信に問題がありました。ありがとう! –

+0

@ARJAVGARG私は助けることができてうれしいです。 ^^ – Voltboyy

関連する問題