package j5; // チャットサーバChatServer.java // このプログラムは,チャットのサーバプログラムです // 使い方java ChatServer [ポート番号] // ポート番号を省略すると,ポート番号6000 番を使います // 起動の例java ChatServer // 終了にはコントロールC を入力してください // このサーバへの接続にはTelnet.javaなどを使ってください // 接続を止めたいときには,行頭でquitと入力してください // ライブラリの利用 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; // ChatServerクラス public class ChatServer { static final int DEFAULT_PORT = 6000;// ポート番号省略時は6000 番を使います static ServerSocket serverSocket; static ArrayList<Socket> connections; // sendAllメソッド // 各クライアントにメッセージを送ります public static void sendAll(String t) { if (connections != null) {// コネクションがあれば実行します for (Socket s : connections) { try { PrintWriter pw = new PrintWriter(s.getOutputStream()); pw.println(t); pw.flush(); } catch (IOException ex) { } } } System.out.println(t); } // addConnectionメソッド // クライアントとの接続を追加します public static void addConnection(Socket s) { if (connections == null) { connections = new ArrayList<Socket>(); } connections.add(s); } // deleteConnectionメソッド // あるクライアントとのコネクションを削除します public static void deleteConnection(Socket s) { if (connections != null) { connections.remove(s); } } // mainメソッド // サーバソケットを作り,クライアントからの接続を待ち受けます public static void main(String[] arg) { int port = DEFAULT_PORT; if (arg.length > 0) port = Integer.parseInt(arg[0]); try { serverSocket = new ServerSocket(port); } catch (IOException e) { System.out.println(e); System.out.println("バインド失敗。ポート番号 "+port+"がすでにつかわれているようです"); System.out.println("ポート番号を変更するか、killall java でポートを使用している他のプロセスを終了してください。"); System.exit(1); } while (true) { try { Socket cs = serverSocket.accept(); addConnection(cs); Thread ct = new Thread(new ClientProc(cs)); ct.start(); } catch (IOException e) { System.err.println(e); } } } } // ClientProcクラス // クライアント処理用スレッドのひな形です class ClientProc implements Runnable { Socket s; BufferedReader in; PrintWriter out; String name = null; ChatServer server = null; // コンストラクタ public ClientProc(Socket s) throws IOException { this.s = s; in = new BufferedReader(new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream()); } // スレッドの本体 // 各クライアントとの接続処理を行います public void run() { try { while (name == null) { out.println("Input your name? "); out.flush(); name = in.readLine(); } ChatServer.sendAll(name + " joined."); String line = in.readLine(); while (!"quit".equals(line)) { if (line != null) ChatServer.sendAll(name + "> " + line); line = in.readLine(); } ChatServer.sendAll(name + " disconnected."); ChatServer.deleteConnection(s); s.close(); } catch (IOException e) { try { s.close(); } catch (IOException e2) { } } } }