package info.istlab.ServerTester; import java.net.InetSocketAddress; import java.util.Collection; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; /** * シンプルなWebSocketサーバ */ public class SimpleWebSocketServer extends WebSocketServer { public static void main(String[] args) { Server.invokeMain(args, "SimpleWebSocketServer"); } int expectedPort; String expectedAddress; boolean bindFailed = false; boolean isClosed = false; public SimpleWebSocketServer() { this(8887, "0.0.0.0"); } public SimpleWebSocketServer(int port) { this(port, "0.0.0.0"); } public SimpleWebSocketServer(String bindaddress) { this(8887, bindaddress); } public SimpleWebSocketServer(int port, String bindaddress) { super(new InetSocketAddress(bindaddress, port)); expectedPort = port; expectedAddress = bindaddress; start(); } @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { System.out.println("[SWS] New connection from " + conn.getRemoteSocketAddress()); conn.send("Welcome to the server! " + conn.getRemoteSocketAddress()); // クライアントにメッセージを送信 broadcastMessage("◆◆◆ "+conn.getRemoteSocketAddress() + " が接続しました ◆◆◆"); // すべてのクライアントにメッセージを送信 } @Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { System.out.println("[SWS] Closed client connection to " + conn.getRemoteSocketAddress()); } @Override public void onMessage(WebSocket conn, String message) { System.out.println("[SWS] Received: " + message + " from " + conn.getRemoteSocketAddress()); // conn.send("Echo: " + message); // 受け取ったメッセージをそのまま返す broadcastMessage(message + " (from "+conn.getRemoteSocketAddress()+")"); // すべてのクライアントにメッセージを送信 } @Override public void onError(WebSocket conn, Exception ex) { System.out.println("[SWS] Error: " + ex.getMessage()); if (ex.getMessage().startsWith("Address already in use")){ bindFailed = true; isClosed = true; } } @Override public void onStart() { System.out.println(getClass().getName() + " [" + expectedAddress + ":" + expectedPort + "] started."); isClosed = false; } // 全クライアントにメッセージをブロードキャストするメソッド private void broadcastMessage(String message) { Collection<WebSocket> clients = this.getConnections(); for (WebSocket client : clients) { if (client.isOpen()) { client.send(message); } } } public String getBindAddress() { return expectedAddress; } public boolean isClosed() { return isClosed; } public String getExpectedAddress() { return expectedAddress; } public int getExpectedPort() { return expectedPort; } public void stop(){ try { super.stop(1000, "SWS stopped"); } catch (InterruptedException e) { e.printStackTrace(); } isClosed = true; } }