diff --git a/src/main/java/info/istlab/ServerTester/App.java b/src/main/java/info/istlab/ServerTester/App.java index b1df7db..ad8f13e 100644 --- a/src/main/java/info/istlab/ServerTester/App.java +++ b/src/main/java/info/istlab/ServerTester/App.java @@ -37,5 +37,7 @@ WhiteBoardServer wb = new WhiteBoardServer(11111, "0.0.0.0"); myhost.addPanel(new ServerPanel(wb, myhost)); + + new UDPServer().start(); } } diff --git a/src/main/java/info/istlab/ServerTester/Host.java b/src/main/java/info/istlab/ServerTester/Host.java index fa3f4c6..4150779 100644 --- a/src/main/java/info/istlab/ServerTester/Host.java +++ b/src/main/java/info/istlab/ServerTester/Host.java @@ -35,6 +35,13 @@ setJMenuBar(menuBar); JMenu menu = new JMenu("Menu"); menuBar.add(menu); + + JMenuItem sendItem = new JMenuItem("Send"); + menu.add(sendItem); + sendItem.addActionListener(e -> { + new UDPClient(); + }); + JMenuItem exitItem = new JMenuItem("Exit"); menu.add(exitItem); exitItem.addActionListener(e -> { diff --git a/src/main/java/info/istlab/ServerTester/UDPClient.java b/src/main/java/info/istlab/ServerTester/UDPClient.java new file mode 100644 index 0000000..376a8d1 --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/UDPClient.java @@ -0,0 +1,48 @@ +package info.istlab.ServerTester; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; + +public class UDPClient { + public static void main(String[] args) { + } + public UDPClient() { + DatagramSocket socket = null; + try { + // クライアントソケットを作成 + socket = new DatagramSocket(); + socket.setBroadcast(true); + InetAddress serverAddress = InetAddress.getByName("255.255.255.255"); + + // 送信メッセージを作成 + String message = "こんにちは、サーバー!"; + byte[] messageData = message.getBytes(); + + // データグラムパケットを作成 + DatagramPacket packet = new DatagramPacket( + messageData, messageData.length, + serverAddress, 54321 + ); + + // メッセージを送信 + socket.send(packet); + System.out.println("メッセージをサーバーに送信しました: " + message); + + // サーバーからの応答を受信 + byte[] buffer = new byte[1024]; + DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length); + socket.receive(responsePacket); + + // 受信したデータを文字列に変換 + String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); + System.out.println("サーバーからの応答: " + response); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (socket != null && !socket.isClosed()) { + socket.close(); + } + } + } +} diff --git a/src/main/java/info/istlab/ServerTester/UDPServer.java b/src/main/java/info/istlab/ServerTester/UDPServer.java new file mode 100644 index 0000000..e3d3de6 --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/UDPServer.java @@ -0,0 +1,69 @@ +package info.istlab.ServerTester; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; + +public class UDPServer implements Runnable { + Thread thread; + DatagramSocket socket = null; + + public static void main(String[] args) { + new UDPServer(); + } + + public UDPServer() { + this(54321); + } + public UDPServer(int port) { + try { + // サーバーソケットを指定されたポートで作成 + socket = new DatagramSocket(port); + + System.out.println("[UDP] UDPサーバーがポート"+port+"で待機中..."); + + } catch (Exception e) { + e.printStackTrace(); + } + } + public void start(){ + if(thread == null){ + thread = new Thread(this); + thread.start(); + } + } + public void run(){ + byte[] buffer = new byte[1024]; + while(thread != null){ + try { + // データグラムパケットを受信 + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket.receive(packet); + + System.out.println("[UDP] "+packet.getAddress().getHostAddress() + ":" + packet.getPort() + " からデータを受信しました。"); + + // 受信したデータを文字列に変換 + String received = new String(packet.getData(), 0, packet.getLength()); + System.out.println("[UDP] 受信したメッセージ: " + received); + + // 返信メッセージを作成 + String response = "サーバーからの応答: " + received; + byte[] responseData = response.getBytes(); + + // 返信データを送信 + DatagramPacket responsePacket = new DatagramPacket( + responseData, responseData.length, + packet.getAddress(), packet.getPort()); + socket.send(responsePacket); + + } catch (IOException e) { + e.printStackTrace(); + thread = null; + } + } + if (socket != null && !socket.isClosed()) { + socket.close(); + System.out.println("[UDP] UDPサーバーを停止しました。"); + } + } +} diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java index 6a6d77c..fd14885 100644 --- a/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardClient.java @@ -11,6 +11,7 @@ import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketException; import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; @@ -34,8 +35,6 @@ public WhiteBoardClient(int port, String address) { address = address.replace("/", ""); - // 指定のポートに対して,ソケットを作成します - // オブジェクトinstrを作り,データ読み出しを準備します try { socket = new Socket(); socket.connect(new InetSocketAddress(address, port), 1000); // 1秒でタイムアウト @@ -64,7 +63,7 @@ @Override public void mouseDragged(MouseEvent e) { - if (e.getX()==lastx && e.getY()==lasty) { + if (e.getX() == lastx && e.getY() == lasty) { return; } tmpStroke.add(e.getPoint()); @@ -118,7 +117,7 @@ synchronized public void paintComponent(Graphics g) { super.paintComponent(g); Iterator it = points.iterator(); - while(it.hasNext()) { + while (it.hasNext()) { int[][] points = MyJSON.fromJSON(it.next()); for (int[] p : points) { int x = p[0]; @@ -152,15 +151,18 @@ } catch (IOException e1) { e1.printStackTrace(); thread = null; + if (e1 instanceof SocketException) { + System.err.println("サーバとの接続が切れました (Connection reset)"); + } } } } } -/** +/** * 上記のrun()において、メッセージを送信しないと reader.readLine() で止まってしまって画面描画されないので、 * 1秒ごとに強制的に再描画するためのスレッド - * */ + */ class RepaintClient implements Runnable { private WhiteBoardClient client; Thread thread;