diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java index 3bf73cd..de2738f 100644 --- a/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java @@ -11,6 +11,8 @@ import java.io.PrintWriter; import java.net.Socket; import java.util.ArrayList; +import java.util.Iterator; +import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JFrame; import javax.swing.JPanel; @@ -21,10 +23,12 @@ private static final String ADDRESS = "127.0.0.1"; JFrame frame; ArrayList tmpStroke = new ArrayList(); - ArrayList points = new ArrayList(); + CopyOnWriteArrayList points = new CopyOnWriteArrayList(); Socket socket = null; BufferedReader reader = null; PrintWriter writer = null; + Thread thread; + public WhiteBoardClient(int port, String address) { address = address.replace("/", ""); @@ -41,12 +45,18 @@ addMouseListener(this); addMouseMotionListener(this); - frame = new JFrame("WhiteBoard"); + frame = new JFrame("WhiteBoard Client " + socket.toString()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(800, 600); + frame.setSize(600, 400); frame.add(this); frame.setVisible(true); + System.out.println("Client socket info: " + socket.toString()); + + thread = new Thread(this); + thread.start(); + + RepaintClient repaintClient = new RepaintClient(this); } @Override @@ -79,8 +89,12 @@ } String msg = MyJSON.toJSON(pts); points.add(msg); - writer.println(msg); repaint(); + + // ここでサーバにメッセージを送信 + writer.println(msg); + writer.flush(); + System.out.println("sent: " + msg.length()); } @Override @@ -91,49 +105,70 @@ public void mouseExited(MouseEvent e) { } - public void paintComponent(Graphics g) { + synchronized public void paintComponent(Graphics g) { super.paintComponent(g); - for (String point : points) { - int[][] points = MyJSON.fromJSON(point); + Iterator it = points.iterator(); + while(it.hasNext()) { + int[][] points = MyJSON.fromJSON(it.next()); for (int[] p : points) { int x = p[0]; int y = p[1]; - g.fillOval(x, y, 5, 5); + g.fillOval(x, y, 3, 3); } } } public static void main(String[] args) { - // if (args.length < 2) { - // System.err.println("Usage: java WhiteBoardClient
"); - // System.exit(1); - // } - // int port = Integer.parseInt(args[0]); - // String address = args[1]; - new WhiteBoardClient(PORT, ADDRESS); + if (args.length < 2) { + System.err.println("Usage: java WhiteBoardClient
"); + System.exit(1); + } + int port = Integer.parseInt(args[0]); + String address = args[1]; + new WhiteBoardClient(port, address); } @Override public void run() { // データを受け取る - // データの終了まで,以下のループを繰り返します - String line = null; - try { - while ((line = reader.readLine()) != null) { - System.out.println(line); - points.add(line); + while (thread != null) { + String line = null; + try { + while ((line = reader.readLine()) != null) { + points.add(line); + System.out.println("received: " + line.length()); + } + repaint(); + } catch (IOException e1) { + e1.printStackTrace(); } - repaint(); - } catch (IOException e1) { - e1.printStackTrace(); } - // コネクションを閉じます - try { - reader.close(); - } catch (Exception e) { - // ネットワーククローズ失敗です - System.err.println("ネットワークのエラーです"); - System.exit(1); + } +} + +/** + * 上記のrun()において、メッセージを送信しないと reader.readLine() で止まってしまって画面描画されないので、 + * 1秒ごとに強制的に再描画するためのスレッド + * */ +class RepaintClient implements Runnable { + private WhiteBoardClient client; + Thread thread; + + public RepaintClient(WhiteBoardClient client) { + this.client = client; + thread = new Thread(this); + thread.start(); + } + + @Override + public void run() { + while (true) { + client.repaint(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } } } @@ -158,14 +193,12 @@ // convert JSON to int[][] public static int[][] fromJSON(String json) { - System.out.println(json); - json = json.substring(2, json.length() - 1).replaceAll("\\],\\[","_"); - System.out.println(json); + json = json.substring(2, json.length() - 1).replaceAll("\\],\\[", "_"); String[] points = json.split("_"); int[][] pts = new int[points.length][2]; for (int i = 0; i < points.length; i++) { - System.out.println(points[i]); - String[] xy = points[i].replaceAll("\\[","").split(","); + // System.out.println(points[i]); + String[] xy = points[i].replaceAll("\\[", "").split(","); pts[i][0] = Integer.parseInt(xy[0]); pts[i][1] = Integer.parseInt(xy[1]); } diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java index 6dcd965..5b815fd 100644 --- a/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java @@ -6,13 +6,16 @@ import java.io.PrintStream; import java.net.Socket; import java.util.ArrayList; +import java.util.Hashtable; public class WhiteBoardServer extends Server { public ArrayList points = new ArrayList(); - public ArrayList handlers = new ArrayList(); + public Hashtable handlers = new Hashtable(); + public WhiteBoardServer() { this(11111, "127.0.0.1"); } + public WhiteBoardServer(int port) { this(port, "127.0.0.1"); } @@ -33,46 +36,66 @@ try { Socket socket = serverSocket.accept(); RequestHandler4WB handler = new RequestHandler4WB(this, socket); - handlers.add(handler); - Thread t = new Thread(handler); - t.start(); + handlers.put(socket.toString(), handler); + System.out.println("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); + } + } + } + } 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; - BufferedReader br = null; - PrintStream os = null; + System.out.println("accept"); + try { + br = new BufferedReader(new InputStreamReader(socket.getInputStream())); + os = new PrintStream(socket.getOutputStream()); + System.out.println(socket.toString()); + // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す + while ((line = br.readLine()) != null) { + System.out.println("(Server received) " + line.length()); - System.out.println("accept"); - try { - br = new BufferedReader(new InputStreamReader(socket.getInputStream())); - os = new PrintStream(socket.getOutputStream()); - // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す - while ((line = br.readLine()) != null) { - System.out.println("(Server received) " + line); - os.println(line); - } - } catch (IOException e) { - // os.close(); - System.out.println(e); - } finally { - System.out.println("disconnected " + socket.toString()); - } + // 自分以外のクライアントにメッセージを送信 + server.publish(line, socket.toString()); + } + } catch (IOException e) { + // os.close(); + System.out.println(e); + } finally { + System.out.println("disconnected " + socket.toString()); + server.handlers.remove(socket.toString()); + System.out.println("残り handlers.size() = " + server.handlers.size()); + } + } - + public void send(String message) { + os.println(message); + os.flush(); + System.out.println("sent to " + socket.toString()); } } \ No newline at end of file