Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / SimpleWebSocketServer.java
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;
    }
}