ネットワーク上で動作する必要がある単純なポンゲームがあります。サーバーはボールと2つのバットの位置でゲームを作成し、クライアントがサーバーに接続すると、サーバーはPongPlayerThreadと呼ばれる新しいクラスを作成します。クライアントからサーバーへの入力ストリームと出力ストリームを使用して、
私のサーバーはクライアントからサーバーへのデータがなくても100%正常に動作し、サーバーは問題なくクライアントに情報を送信できますが、奇妙な問題があります。しかし、最初に私のコードを示します。これで、私が持っているものを確認できます。
PongServer
try
{
serverSocket = new ServerSocket(port);
listen = true;
System.out.println("Server was setup and will try to create a socket");
}
catch(IOException e)
{
System.err.println("Could not listen on port:" + port);
System.exit(1);
}
while(listen)
{
players[idPlayer] = new PongPlayerThread(serverSocket.accept(), idPlayer, rtnInfo());
players[idPlayer].start();
System.out.println("Client Connected with ID:" + idPlayer);
players[0].passData(rtnInfo());
idPlayer++;
if(idPlayer > 1)
{
listen = false;
playing = true;
}
}
while(playing)
{
players[0].passData(rtnInfo());
players[0].sleep(25);
players[1].passData(rtnInfo());
players[1].sleep(25);
}
....//more, but not important
これが私のPongClientです
try
{
socket = new Socket(host, port);
serverOut = new PrintWriter(socket.getOutputStream(), true);
serverInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
catch (UnknownHostException e)
{
System.err.println("Couold not connect to host:" + host);
System.exit(1);
}
catch (IOException e)
{
System.err.println("Could not get Input/Output from server");
System.exit(1);
}
...
while ((pos = serverInput.readLine()) != null)
{
String text = "nothing";
serverOut.println(text);
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));
/*if(PongController.moveUp == true)
{
System.out.println("Up");
serverOut.println("up");
PongController.moveUp = false;
}
else
{
serverOut.println("nothing");
}*/
}
これが私のPongPlayerThreadです
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
String text = "hhh";
System.out.println(in.toString());
//System.out.println(text = in.readLine());
System.out.println("Checking readLine value");
String line;
if ((line = in.readLine()) == null)
{
System.out.println("A ok");
}
else
{
System.out.println(":" + line);
}
while(send)
{
//String temp = in.readLine();
//if(temp.equals("up"))
//{
// System.out.println("Up you say");
//}
out.println(pongData);
}
out.close();
in.close();
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
サーバーを実行すると問題ありません。クライアントを接続すると、ポンボールは別のプレーヤーを待つ間静止しているはずですが、閉じるとサーバーからデータを取得せずにボールが更新されます。クライアントプログラム、私のサーバーはこのエラーを思い付くでしょう
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Pong.PongPlayerThread.run(PongPlayerThread.java:42)
PongPlayerThreadの42行目はこれです
if ((line = in.readLine()) == null)
私はこれを何日も修正しようとしましたが、まだ解決策が見つかりませんでした。inputStreamがクライアントのoutputStreamに接続できないようです。wireSharkを使用しようとしましたが、これはLANプログラムなので、動作し、wireSharkには何も表示されません。誰かがこれに光を当てることができれば、それは大いにありがたいです。
キャンバス
iTechアップデートわかりましたここであなたのコードを使用しましたこれが私のPongPlayerThreadにあります
public void run()
{
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
String text = "hhh";
System.out.println(in.toString());
//System.out.println(text = in.readLine());
System.out.println("Checking readLine value");
String line = null;
if ((line = in.readLine()) != null) // why you check if it is null !?
{
System.out.println("Client sent: "+line);
}
while(send)
{
out.println(pongData);
}
out.close();
in.close();
socket.close();
}
これはコンソールに「Clientsent:Hello」と表示されますが、私のクライアントは停止せず、サーバーからデータを取り込み続けます。
あなたが私に与えたifステートメントをout.println(pongData)を持つwhileステートメントに入れると、それは機能しますが、クライアントが接続して切断するとエラーが発生するか、2つのクライアントが接続して両方がiを離れるとエラーが発生しますこのエラーをもう一度取得します:(
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Pong.PongPlayerThread.run(PongPlayerThread.java:45)
45行目は
if ((line = in.readLine()) != null) // why you check if it is null !?
コードを整理しましたが、今は私のpongClientコードにあります
while ((pos = serverInput.readLine()) != null)
{
String text = "nothing";
serverOut.println(text);
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));
if(PongController.moveUp == true)
{
System.out.println("Up");
serverOut.println("up");
PongController.moveUp = false;
}
else
{
serverOut.println("nothing");
}
}
これに達すると、何も実行されず、エラー全体が再び発生します。
私が置いていたエラーを見つけました
if ((line = in.readLine()) != null)
{
line = in.readLine()をもう一度置くと、エラーが発生します。奇妙ですが、現在は修正されており、データはクライアントからサーバーに、サーバーからクライアントに送信できます:)