2

ネットワーク上で動作する必要がある単純なポンゲームがあります。サーバーはボールと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 !?

コードを整理しましたが、今は私のp​​ongClientコードにあります

 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()をもう一度置くと、エラーが発生します。奇妙ですが、現在は修正されており、データはクライアントからサーバーに、サーバーからクライアントに送信できます:)

4

2 に答える 2

0

クライアントがサーバーに接続すると、if ((line = in.readLine()) == null)クライアントからメッセージが受信されるまでスレッドがブロックされます。

接続が確立された後、クライアントから何かを送信する必要があります

で、以下を変更してブロックPongPlayerThreadを削除できますelse

String line = null; 
if ((line = in.readLine()) != null) // why you check if it is null !?
{ 
    System.out.println("Client sent: "+line); 
} 

PongClient接続を確立した後、メッセージsocketを送信できます。serverOut.println("Hello");

于 2013-02-16T19:39:06.883 に答える
0

「接続のリセット」にはいくつかの原因がありますが、最も一般的な原因は、もう一方の端ですでに閉じられている接続に書き込んだことです。つまり、アプリケーションプロトコルエラーです。

于 2013-02-17T00:20:58.183 に答える