0

誰かがこの問題で私を助けてくれることを望んでいました。両方のクライアント スレッドが起動するまで、GUI JFrame がコンポーネントを表示しないマルチスレッド サーバー アプリがあります。各クライアントは、内部クラスの ext Thread で作成されたスレッドです。

1 つのクライアントがソケット接続を介して参加し、ストリームが確立された後、クライアント 2 が参加するまで中断されます。両方のクライアント スレッドが確立され、ストリームが作成されるとすぐに、クライアント 1 が中断 (false) に設定され、両方のクライアント スレッドが起動されます。JFrameがコンポーネントを表示するのは今だけです....

main メソッドも EDT で呼び出されます。

 public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable(){

        @Override
        public void run() {
                MorseCode_Server serverApp= new MorseCode_Server();
                serverApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    serverApp.execute();

        }

ここに関連するコードがわからないので、これらを追加しました: このメソッドは、外部クラスで呼び出される最初のメソッドであり、各クライアント/プレーヤーを設定し、2 番目の準備が整うまで最初のスレッドを中断します:

displayMessage("Execute Called(): ");
    for (int i = 0; i < players.length; i++) {
        try {
            players[i] = new Player(socket.accept(), i);//assign soc & playerNumber
            //clientIP[i] =  //get IP address for message log
            players[i].start();//JVM calls the threads run method
            displayMessage("Execute(): Player " + players[i] + " socket created in execute (OUTER CLASS)");
            //get IP address of playet[i]


        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }//end for
    //player 0 is suspended once socket created until player 1 is instantiated
    //must retrun player 0 to resume state in synchronised block to allow one 
    //thread access at a time
    synchronized (players[0]) {
        players[0].setSuspended(false);
        players[0].notifyAll();//wake up threads waiting on this object
        displayMessage("Execute(): "+ players[0] + " players number notifyAll called in execute");
    }//end synchronised block

これは、各クライアント スレッドの内部クラス コンストラクターです。

private class Player extends Thread {
    //instance varibles for each client/player
public Player(Socket accept, int i) {
        connection = accept;
        //clientIP[i] = connection.getRemoteSocketAddress().toString();
        playerNumber = i;
        displayMessage("Player " + playerNumber + " costructor thread inner class  called");
        //open socket streams for communication
        try {
            //objectouptstream obj wraps the low level code from getOutputStream method
            output = new ObjectOutputStream(connection.getOutputStream());
            output.flush();
            input = new ObjectInputStream(connection.getInputStream());
            displayMessage("Player " + playerNumber + " output/input streams set up in Player inner class..END CONSTRUCTOR PLAYER");

        } catch (IOException e) {
            e.printStackTrace();
        }



    }//end constructor inner class Player

また、接続を介してクライアントの IP アドレスを取得しようとすると、次のようになります。

clientIP[i] = connection.getRemoteSocketAddress().toString();

ヌルポインタ例外が発生します!! 乾杯 C

4

1 に答える 1