diff --git a/.vscode/settings.json b/.vscode/settings.json index e0f15db..317e419 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,10 @@ { - "java.configuration.updateBuildConfiguration": "automatic" + "java.configuration.updateBuildConfiguration": "automatic", + "java.completion.filteredTypes": [ + "com.sun.*", + "sun.*", + "jdk.*", + "org.graalvm.*", + "io.micrometer.shaded.*" + ] } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0db8967..f70b6b1 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,12 @@ 3.8.1 test + + diff --git a/src/main/java/info/istlab/ServerTester/App.java b/src/main/java/info/istlab/ServerTester/App.java index c290022..fbb6e19 100644 --- a/src/main/java/info/istlab/ServerTester/App.java +++ b/src/main/java/info/istlab/ServerTester/App.java @@ -34,6 +34,9 @@ EchoServer echo = new EchoServer(10008); myhost.addPanel(new ServerPanel(echo)); + + WhiteBoardServer wb = new WhiteBoardServer(11111); + myhost.addPanel(new ServerPanel(wb)); } } diff --git a/src/main/java/info/istlab/ServerTester/Server.java b/src/main/java/info/istlab/ServerTester/Server.java index 481686d..d85c5fe 100644 --- a/src/main/java/info/istlab/ServerTester/Server.java +++ b/src/main/java/info/istlab/ServerTester/Server.java @@ -22,7 +22,7 @@ System.err.println("ポート番号またはバインドアドレスを変更してください。"); System.err.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); } - System.out.println("Server [" + bindaddress + ":" + port + "] started."); + System.out.println(getClass().getName()+" [" + bindaddress + ":" + port + "] started."); } public void handleRequest() { diff --git a/src/main/java/info/istlab/ServerTester/ServerPanel.java b/src/main/java/info/istlab/ServerTester/ServerPanel.java index bdf6189..2e5caeb 100644 --- a/src/main/java/info/istlab/ServerTester/ServerPanel.java +++ b/src/main/java/info/istlab/ServerTester/ServerPanel.java @@ -59,6 +59,9 @@ } else if (name.startsWith("Time") || name.startsWith("ThreadTime")) { new JExecutor("TimeClient", server.getPort() + " " + server.getBindAddress()); // new TimeClient(server.getPort(), server.getBindAddress()); + } else if (name.startsWith("WhiteBoard")) { + new JExecutor("WhiteBoardClient", server.getPort() + " " + server.getBindAddress()); + // new WhiteBoardClient(server.getPort(), server.getBindAddress()); } }); thread = new Thread(this); diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java new file mode 100644 index 0000000..3bf73cd --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java @@ -0,0 +1,174 @@ +package info.istlab.ServerTester; + +import java.awt.Graphics; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.ArrayList; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +public class WhiteBoardClient extends JPanel implements MouseListener, MouseMotionListener, Runnable { + private static final long serialVersionUID = 1L; + private static final int PORT = 11111; + private static final String ADDRESS = "127.0.0.1"; + JFrame frame; + ArrayList tmpStroke = new ArrayList(); + ArrayList points = new ArrayList(); + Socket socket = null; + BufferedReader reader = null; + PrintWriter writer = null; + public WhiteBoardClient(int port, String address) { + address = address.replace("/", ""); + + // 指定のポートに対して,ソケットを作成します + // オブジェクトinstrを作り,データ読み出しを準備します + try { + socket = new Socket(address, port); + reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + writer = new PrintWriter(socket.getOutputStream(), true); + } catch (Exception e) { + System.err.println("サーバ [" + address + ":" + port + "] に接続できませんでした"); + System.exit(1); // 異常終了(エラーで終了)なら1 + } + + addMouseListener(this); + addMouseMotionListener(this); + frame = new JFrame("WhiteBoard"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(800, 600); + frame.add(this); + frame.setVisible(true); + + } + + @Override + public void mouseDragged(MouseEvent e) { + tmpStroke.add(e.getPoint()); + repaint(); + } + + @Override + public void mouseMoved(MouseEvent e) { + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + tmpStroke = new ArrayList(); + tmpStroke.add(e.getPoint()); + } + + @Override + public void mouseReleased(MouseEvent e) { + tmpStroke.add(e.getPoint()); + int[][] pts = new int[tmpStroke.size()][2]; + for (int i = 0; i < tmpStroke.size(); i++) { + pts[i][0] = tmpStroke.get(i).x; + pts[i][1] = tmpStroke.get(i).y; + } + String msg = MyJSON.toJSON(pts); + points.add(msg); + writer.println(msg); + repaint(); + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + for (String point : points) { + int[][] points = MyJSON.fromJSON(point); + for (int[] p : points) { + int x = p[0]; + int y = p[1]; + g.fillOval(x, y, 5, 5); + } + } + } + + 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); + } + + @Override + public void run() { + // データを受け取る + // データの終了まで,以下のループを繰り返します + String line = null; + try { + while ((line = reader.readLine()) != null) { + System.out.println(line); + points.add(line); + } + repaint(); + } catch (IOException e1) { + e1.printStackTrace(); + } + // コネクションを閉じます + try { + reader.close(); + } catch (Exception e) { + // ネットワーククローズ失敗です + System.err.println("ネットワークのエラーです"); + System.exit(1); + } + } +} + +class MyJSON { + // convert int[][] to JSON + public static String toJSON(int[][] points) { + StringBuffer sb = new StringBuffer(); + sb.append("["); + for (int i = 0; i < points.length; i++) { + sb.append("["); + sb.append(points[i][0]); + sb.append(","); + sb.append(points[i][1]); + sb.append("]"); + if (i < points.length - 1) { + sb.append(","); + } + } + return sb.toString(); + } + + // 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); + 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(","); + pts[i][0] = Integer.parseInt(xy[0]); + pts[i][1] = Integer.parseInt(xy[1]); + } + return pts; + } +} diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java new file mode 100644 index 0000000..6dcd965 --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java @@ -0,0 +1,78 @@ +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; + +public class WhiteBoardServer extends Server { + public ArrayList points = new ArrayList(); + public ArrayList handlers = new ArrayList(); + 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.add(handler); + Thread t = new Thread(handler); + t.start(); + } catch (IOException e) { + } + } + +} + +class RequestHandler4WB implements Runnable { + private WhiteBoardServer server; + private Socket socket; + + public RequestHandler4WB(WhiteBoardServer server, Socket socket) { + this.server = server; + this.socket = socket; + } + + @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()); + // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す + 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()); + } + + + } +} \ No newline at end of file