0

JavaでArrayListを使用すると問題が発生します。新しいクラスオブジェクトを作成し、その値を指定し、そのオブジェクトをarrayListに追加してから、すでに使用されているオブジェクトにキーワード「new」を使用して再利用しています別のデータですが、変更されていないが以前に設定されたデータはまだ設定されていますか?

これが私のコードです

private static ArrayList<PongServerThread> games = new ArrayList<PongServerThread>();
private static int players = 0;
private static PongServerThread game;

public static void main( String args[] ) throws IOException, InterruptedException
{   
    while(true)
    {
        System.out.println("Start of Loop");

        if(game.getPlayers() == 0)
        {
            System.out.println("Waiting for players");
        }
        if(game.getPlayers() == 2)
        {
            System.out.println("Game Added");
            games.add(game);
            games.get((games.size())-1).start();
            game.setPlayers(0);
        }

        game = new PongServerThread();
    }
}

このコードは正常に動作しますが、私の PongServerThread では、2 つのクライアントが接続されると main がスレッドを開始し、新しい PongServerThread オブジェクトを開始する必要があるため、さらに 2 つのクライアントがそのスレッドに接続できますが、何が起こっているかは、1 回 2スレッドが開始するクライアント、ここに新しいスレッド

game = new PongServerThread();

これは再び作成されますが、新しいクライアントが接続すると最初のクライアントを引き継ぎ、別のクライアントが接続すると 2 番目のクライアントを引き継ぎます。

game = new PongServerThread();

本当に新しい PongServerThread を作成しているわけではありません。これを修正するにはどうすればよいですか? また、2 つのクライアントが接続し、さらに 1 つ接続したときのコンソール出力もここにあります。

Start of Loop
Waiting for players
Pong
400.0:301.0:60.0:300.0:740.0:300.0
Server started
Server was setup and will try to create a socket
Client Connected with ID:0
Checking readLine value
Client Connected with ID:1
Start of Loop
Game Added
Pong
400.0:300.0:60.0:300.0:740.0:300.0
Server started
Server was setup and will try to create a socket
Checking readLine value
Client Connected with ID:0
Checking readLine value

ライアンの更新 -----

これが私のサーバーコンストラクターです

public PongServerThread() throws IOException, InterruptedException
{

    //Setup
            super("PongServerThread");
            setupPong();
            boolean listen = false;
            boolean playing = false;
            System.out.println(rtnInfo());


            System.out.println("Server started");
            //Create a serverSocket to listen on
            ServerSocket serverSocket = null;

            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)
            {
                /*PongPlayerThread player1 = */
                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;
                }
            }

            int timer = 0;
            System.out.println("Server Closed");
            serverSocket.close();

}

- -アップデート - -

いくつかの変数を静的に宣言していることに気付きました。これがおそらくエラーが発生した理由ですが、サーバーコードを実行しようとすると

class Main
{
// Variable
private ArrayList<PongServerThread> games = new ArrayList<PongServerThread>();
private int players = 0;
private PongServerThread game;

public void main( String args[] ) throws IOException, InterruptedException
{   
    //PongServerThread game = new PongServerThread();
    /*if(pt.getPlayers() == 2)
    {
        System.out.println("Started");
        pt.start();
    }*/

     PongServerThread game = new PongServerThread();
        while(true)
        {
            games.add(game);
            System.out.println("Game Added");
            game.start();

            game = new PongServerThread();
        }
    /*System.out.println("Pong");
    PongModel model = new PongModel();
    PongView  view  = new PongView();
                      new PongController( model, view );

    model.addObserver( view );       // Add observer to the model

    view.setVisible(true);           // Display Screen
    model.makeActiveObject();        // Start play*/
}
}

このエラーが発生します

Could not get Input/Output from server

なぜ私がそれを取得するのか、誰かが知っていますか?必要に応じて、さらにコードを貼り付けることができます。

4

2 に答える 2

1

スレッドを開始するには、次のように呼び出す必要があります。

game.start();

一般に、 を実装してRunnableから次のように言うのが望ましいです。

Runnable myThread = ...;
new Thread(myThread).start();
于 2013-02-21T03:14:57.597 に答える
0

PongServerThread() は 2 人のプレイヤーがいるゲームの場合にのみ返されるため、メイン関数を大幅に簡素化できます。

{
    PongServerThread game = new PongServerThread();
    while(true)
    {
        games.add(game);
        System.out.println("Game Added");
        game.start();

        game = new PongServerThread();
    }
}

game.setPlayers(0);は非常に奇妙でした: ゲームが 2 人のプレーヤーで開始されたばかりのときに、ゲームのプレーヤー数をゼロに設定するのはなぜですか。

編集:

私が正しく理解していれば、setPlaysers(0)呼び出しは static variable にゼロを設定しますplayers。これが、3 番目のクライアントが ID = 0 を取得する理由です。4 番目のクライアントは ID = 1 を取得しました。たぶんそれは「上書き」のように見えます。

したがって、削除するgame.setPlayers(0);とこれが修正され、すべてのプレイヤーが一意の識別子を取得します。

于 2013-02-21T19:01:47.430 に答える