【Java×Socket通信】リアルタイムチャットアプリを自作!初心者でも動かせるコード解説付き

プログラミング

「Javaでリアルタイム通信を学びたいけど難しそう」
「チャットアプリのような双方向のやりとりを作れるようになりたい」
そんな悩みをお持ちの方にぴったりなのが、Javaで作る簡易チャットアプリの自作体験です。

Socket通信を使えば、1対1の通信をリアルタイムで実現できます。
シンプルな構造から始めることで、ネットワーク通信の仕組みとエラー処理の基本が自然と身につきます。

この記事では、初心者でも作れるチャットアプリを、
プロ目線でわかりやすくコード付きで解説します。


チャットアプリとは?

リアルタイム通信を学ぶ最高の題材です

結論:チャットアプリを作ると、ネットワーク通信の基礎が一通り身につきます。

Javaには Socket という通信の仕組みが用意されており、
これを使うと、プログラム同士でメッセージを送ったり受け取ったりできます。

リアルタイム通信は、LINEやゲームなどあらゆる分野で使われています。
この仕組みを自作して体験することは、実践力アップに直結します。


構成と必要な機能

最低限2つのプログラムが必要です

結論:サーバー側とクライアント側をそれぞれ作ります。

構成は以下のとおりです:

1
2
3
src/
├─ ChatServer.java
└─ ChatClient.java

実現する機能:

  • クライアントがメッセージを送信
  • サーバーがメッセージを受信し、全員に中継
  • 双方向のやりとりをスレッドで並行処理

サーバー側のコード:ChatServer.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.io.*;
import java.net.*;
import java.util.*;
 
public class ChatServer {
    private static final int PORT = 5000;
    private static List<PrintWriter> clientWriters = new ArrayList<>();
 
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("サーバー起動:" + PORT + "番ポートで待機中...");
 
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("クライアント接続:" + socket);
            new ClientHandler(socket).start();
        }
    }
 
    static class ClientHandler extends Thread {
        private Socket socket;
        private PrintWriter out;
 
        public ClientHandler(Socket socket) {
            this.socket = socket;
        }
 
        public void run() {
            try (
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            ) {
                out = new PrintWriter(socket.getOutputStream(), true);
                clientWriters.add(out);
 
                String msg;
                while ((msg = in.readLine()) != null) {
                    System.out.println("受信:" + msg);
                    for (PrintWriter writer : clientWriters) {
                        writer.println(msg);
                    }
                }
            } catch (IOException e) {
                System.out.println("通信エラー:" + e.getMessage());
            } finally {
                if (out != null) clientWriters.remove(out);
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println("ソケット閉鎖失敗");
                }
            }
        }
    }
}

クライアント側のコード:ChatClient.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.*;
import java.net.*;
 
public class ChatClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 5000);
        System.out.println("サーバーに接続しました");
 
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
 
        new Thread(() -> {
            try {
                String fromServer;
                while ((fromServer = in.readLine()) != null) {
                    System.out.println("サーバーから:" + fromServer);
                }
            } catch (IOException e) {
                System.out.println("読み取りエラー");
            }
        }).start();
 
        String input;
        while ((input = stdIn.readLine()) != null) {
            out.println(input);
        }
 
        socket.close();
    }
}

躓きやすいエラーと対策

  • ポートが使用中
    → 対策:5000番ポートが他のアプリで使われている場合は変更しましょう。
  • メッセージが届かない
    → 対策:PrintWriterautoFlush=trueを指定することで即時送信されます。
  • 複数人接続で落ちる
    → 対策:synchronizedでアクセス制御することで安全に配信できます(今回は簡略化)。

応用アイデアでさらに実用的に

  • GUIチャット画面(SwingJavaFX)の追加
  • 名前付きチャット(ニックネーム入力)
  • メッセージ履歴の保存機能
  • スタンプや絵文字の送受信(バイナリ処理)

完成形構成のまとめ

  • ChatServer.java:接続の受付・メッセージ配信処理
  • ChatClient.java:ユーザー入力・サーバーからの受信処理
  • 通信方式:Socket(TCP通信)
  • 並行処理:サーバーはThreadで複数クライアント対応、クライアントも受信を別スレッドで処理

まとめ:リアルタイム通信はJavaで学べる

この記事では、JavaのSocket通信でリアルタイムチャットを作る方法を紹介しました。

この記事で得られる力:

  • クライアント・サーバー通信の基礎
  • SocketThreadの組み合わせによる双方向処理
  • エラー対応と並行処理の考え方

チャットアプリはシンプルながらも奥が深く、ネットワークプログラミングの最適な教材です。
ぜひ動かしながら、自分だけのチャットツールに発展させてみてください!

タイトルとURLをコピーしました