これまでのサーバークライアントアプリケーションは完全に動作していました。それから突然、私はそれを実行することを決めたときに(最初にサーバーとクライアント)、サーバーウィンドウは、クライアントウィンドウを開いて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で両方のプロジェクト
私たちがコードなしで答える方法はありません。そしてあなたの完全なアプリケーションではなく、それが[mcve]であることを確認してください。そうすれば、自分たちでテストすることができます。 – RealSkeptic
私はいくつかの例外が発生しなければならないと思います。だから、それらを記録して、それらにも質問を加えてください。上記のコメントに記載されているいくつかのコード例も歓迎します。 – mike
例外は一度もなく、JVMは2回目に例外をバインドします。私は余分なコードを追加しました –