サーバーはこのコードをスレッドで実行するため、クライアントが接続するのを待っている間に GUI を操作できます (現在、1 つのクライアントと 1 つのサーバーしか使用していません)。
@Override
public void run() {
Socket client = null;
MessageListener listener = null;
try {
client = server.accept();
oos = new ObjectOutputStream(client.getOutputStream());
ois = new ObjectInputStream(client.getInputStream());
listener = new MessageListener(ois);
(new Thread(listener)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
クライアントはこのコードを 1 回実行してサーバーに接続し、入出力ストリームを修正します。
try {
ois = new ObjectInputStream(server.getInputStream());
MessageListener listener = new MessageListener(ois);
oos = new ObjectOutputStream(server.getOutputStream());
(new Thread(listener)).start();
} catch (IOException e) {
e.printStackTrace();
}
MessageListener はスレッドを実行して、着信メッセージをチェックします。
@Override
public void run() {
while (true) {
Message message = null;
try {
message = (Message) in.readObject();
if (message != null) {
System.out.println(message.getName());
}
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
ただし、プログラムを起動すると、最初はサーバーからクライアントにしか送信できず、その逆はできません (クライアント GUI と対話することはできません)。サーバーからクライアントに最初のメッセージを送信すると、次のエラー メッセージが表示されます。
java.io.StreamCorruptedException: invalid type code: 6F
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.jale.chat.iohandling.MessageListener.run(MessageListener.java:25)
at java.lang.Thread.run(Unknown Source)
編集:最初のエラー メッセージを受け取った後、クライアントからサーバーにのみ送信できます (送信は実際に機能します) が、エラー メッセージがコンソールにスパムを送信し続けます。
MessageListener の 25 行目:
message = (Message) in.readObject();
google/Stack Overflow では何も見つかりませんでした。取得時の一般的な問題は、人々が複数または単一のソケットをStreamCorruptedException
開く場合にあるようですが、私は行っていません。どんな助けでも大歓迎です。InputStreams
OutputStreams