サーバーはこのコードをスレッドで実行するため、クライアントが接続するのを待っている間に 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開く場合にあるようですが、私は行っていません。どんな助けでも大歓迎です。InputStreamsOutputStreams