1

私は初心者プログラマーで、現在 Java プロジェクトで立ち往生しています。オブジェクト指向のシングルプレイヤー マインスイーパ ゲームが完全に機能しており、TCP マルチプレイヤー機能を実装しようとしています。ゲームには、ビュー、ゲーム フィールド、タイマー、ラベルを処理するコントロール クラスがあり、アクション リスナーなどがあります。マルチプレイヤーの場合、Socker と ServerSocket を持つ別のスレッドを作成しようとしています。コンストラクターによって渡されるパラメーターは、ホストまたはクライアントとして機能します。実行中は、入力ストリームからカスタム Packet クラスを読み取ろうとする必要があり、別のメソッドでパケットを送信できます。コードは次のとおりです。

public class MultiThread extends Thread {

GameControl gc;
ServerSocket servSocket;
Socket socket;
Packet data;
ObjectInputStream incoming;
ObjectOutputStream outgoing;
Boolean isHost;
Boolean commEnd;

public MultiThread(GameControl gc, Boolean isHost) {
    this.gc = gc;
    this.isHost = isHost;
    this.commEnd = false;
    gc.chatDialog.setVisible(true);
}

public void run() {
    try {
        if (isHost) {
            servSocket = new ServerSocket(1234);
            gc.chatDialog.status.setText("Awaiting connection...");
            socket = servSocket.accept();
            gc.chatDialog.status.setText("Connected.");
            incoming = new ObjectInputStream(socket.getInputStream());
            outgoing = new ObjectOutputStream(socket.getOutputStream());
        }
        else if (!isHost){
            socket = new Socket("localhost", 1234);
            if (socket.isConnected()) {
                gc.chatDialog.status.setText("Connected.");
                incoming = new ObjectInputStream(socket.getInputStream());
                outgoing = new ObjectOutputStream(socket.getOutputStream());
            }
            else {
                gc.chatDialog.status.setText("No connection.");
            }
        }


        while (!commEnd) {
            try {
                Thread.sleep(100);
                data = (Packet)incoming.readObject();
                System.out.println(data.msg);
                gc.chatDialog.chatArea.append(data.getMsg());   
            }
            catch (IOException e) {e.printStackTrace();}
        }

        System.out.println("asd");
        gc.chatDialog.status.setText("No connection");
        incoming.close();
        outgoing.close();
        socket.close();
        servSocket.close();
    }

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

public void sendPacket(Packet p) {
    try {
        outgoing.writeObject(p);
    }
    catch (IOException e) {e.printStackTrace();}
}

}

接続は localhost で確立されますが、受信フィールドと送信フィールドを初期化しようとすると例外がスローされます。コードがごちゃごちゃしていて申し訳ありません。深刻な誤解をしているように感じますので、助けていただければ幸いです。

4

0 に答える 0