私は初心者プログラマーで、現在 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 で確立されますが、受信フィールドと送信フィールドを初期化しようとすると例外がスローされます。コードがごちゃごちゃしていて申し訳ありません。深刻な誤解をしているように感じますので、助けていただければ幸いです。