package info.istlab.ServerTester; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.util.ArrayList; import java.util.Hashtable; public class WhiteBoardServer extends Server { public ArrayList<String> points = new ArrayList<String>(); public Hashtable<String, RequestHandler4WB> handlers = new Hashtable<String, RequestHandler4WB>(); public WhiteBoardServer() { this(11111, "127.0.0.1"); } public WhiteBoardServer(int port) { this(port, "127.0.0.1"); } public WhiteBoardServer(int port, String address) { super(port, address); start(); } public void handleRequest() { if (!serverSocket.isBound()) { try { serverSocket.close(); } catch (IOException e) { } return; } try { Socket socket = serverSocket.accept(); RequestHandler4WB handler = new RequestHandler4WB(this, socket); handlers.put(socket.toString(), handler); System.out.println("[WB] connected " + socket.toString()); } catch (IOException e) { } } // 自分以外のクライアントにメッセージを送信 public void publish(String message, String sender) { for (String key : handlers.keySet()) { RequestHandler4WB handler = handlers.get(key); if (!key.equals(sender)) { handler.send(message); } } } public static void main(String[] args) { invokeMain(args, "WhiteBoardServer"); } } class RequestHandler4WB implements Runnable { private WhiteBoardServer server; private Socket socket; BufferedReader br = null; PrintStream os = null; Thread thread = null; public RequestHandler4WB(WhiteBoardServer server, Socket socket) { this.server = server; this.socket = socket; thread = new Thread(this); thread.start(); } @Override public void run() { String line = null; System.out.println("[WB] accept"); try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); os = new PrintStream(socket.getOutputStream()); System.out.println("[WB] "+socket.toString()); // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す while ((line = br.readLine()) != null) { System.out.println("[WB] Server received: " + line.length()); // 自分以外のクライアントにメッセージを送信 server.publish(line, socket.toString()); } } catch (IOException e) { // os.close(); System.out.println(e); } finally { System.out.println("[WB] disconnected: " + socket.toString()); server.handlers.remove(socket.toString()); System.out.println("[WB] 残り handlers.size() = " + server.handlers.size()); } } public void send(String message) { os.println(message); os.flush(); System.out.println("[WB] sent to " + socket.toString()); } }