0

と の 2 つのクラスがGameServerありNetworkThreadます。プログラムは別の場所からソケットを作成し、それをNetworkThreadのコンストラクター
に渡します。2 つのクライアントが必要で、これら 2 つが相互に対話します。NetworkThreadコンストラクターの最初のクライアントの IDは 1 で、もう一方のクライアントの ID は 2 ですNetworkThread。これが私のコードです:

NetworkThread クラス:

public class NetworkThread implements Runnable, ActionListener {

    Socket newClient;
    String userName;
    int id;

    Scanner sc = null;
    PrintWriter pw = null;

    public NetworkThread(Socket newClient, String userName, int id) {
        this.userName = userName;
        this.newClient = newClient;
        this.id = id;

        try {
            pw = new PrintWriter(newClient.getOutputStream());
            sc = new Scanner(newClient.getInputStream());
        } catch (IOException e) {
        }

        ConstructFrame();
        if (id == 1)
            changeTurnAsAGuesser();
        else
            startConnectionForSecondPlayer();
    }

    @Override
    public void run() {
    }

    private void changeTurnAsAGuesser() {   
        String word;
        String passing;

        word = JOptionPane.showInputDialog(null, "Enter Word",
                "input" + userName, JOptionPane.QUESTION_MESSAGE).toUpperCase();
        passing = "~:";
            do {
                char x = sc.nextLine().charAt(0);
                // after some works with ~> passing
                pw.println(passing);
                pw.flush();
            } while (checkWord(word, passing) == false);

                 //checkWord method returns a boolean
        } catch (Exception e) {
        }
    }
    private void startConnectionForSecondPlayer() {
        new Thread() {
            public void run() {
                while (true) {
                    String taken = sc.nextLine();
                    jf.setTitle(taken);
                }
            }
        }.start();
    }
}

ゲーム サーバー クラス:

public class GameServer {

    static int i = 0;
    ServerSocket gameServer = null;
    String userName;

    public GameServer(String username) {
        this.userName = username;
        new Thread() {
            public void run() {
                try {
                    gameServer = new ServerSocket(4444);
                } catch (IOException e) {
                }
                while (true) {
                    try {
                        i++;
                        Socket newClient = gameServer.accept();
                        System.out.println(i);
                        Thread th = new Thread(new NetworkThread(newClient,
                                userName, i));
                        th.start();
                    } catch (UnknownHostException e) {
                    } catch (IOException e) {
                    }
                }
            }
        }.start();
    }
}  

編集: 最初のクライアントが単語を伝え、もう 1 つのクライアントがその単語を推測しようとするハングマン ゲームを実装したいのですが、私の主な問題は、正常な接続を開始できないことです!

4

1 に答える 1

1

ああ、なるほど。NetworkThreadメソッドではなく、コンストラクターですべての作業を行っていますrun()。コンストラクターでは、の場合、それは。を実行したのと同じスレッドをid == 1呼び出します。戻るまで、他の呼び出しは行われません。changeTurnAsAGuesseracceptaccept

if (id == 1)コンストラクターからコードを削除run()し、バックグラウンドスレッドによって呼び出されるメソッドに移動する必要があります。

public NetworkThread(Socket newClient, String userName, int id) {
    ...
    ConstructFrame();
    // don't do the interactive work in the constructor
}

@Override
public void run() {
    // do it in the background thread
    if (id == 1)
        changeTurnAsAGuesser();
    else
        startConnectionForSecondPlayer();
}
于 2012-04-10T16:00:52.383 に答える