Package net.bashtech.geobot

Source Code of net.bashtech.geobot.WSServer

package net.bashtech.geobot;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class WSServer extends WebSocketServer {

    private Set<WebSocket> adminFeed = new HashSet<WebSocket>();

    public WSServer(int port) throws UnknownHostException {
        super(new InetSocketAddress(port));
    }

    public WSServer(InetSocketAddress address) {
        super(address);
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        String resource = conn.getResourceDescriptor().substring(1);
        System.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() + " connected.");

        String log = "";
        if (resource.equals(BotManager.getInstance().wsAdminPassword)) {
            log = "WS: " + conn.getRemoteSocketAddress().getAddress().getHostAddress() + " logged in as Admin";
            System.out.println(log);
            synchronized (adminFeed) {
                adminFeed.add(conn);
            }
        }
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        System.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() + " disconnected.");
        synchronized (adminFeed) {
            adminFeed.remove(conn);
        }
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        String log = "";

        if (message.length() < 1)
            return;

        conn.send(log);
        sendToAdmin(log);
        System.out.println(conn + ": " + message);
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        ex.printStackTrace();
        if (conn != null) {
            // some errors like port binding failed may not be assignable to a specific websocket
        }
    }

    /**
     * Sends <var>text</var> to all currently connected WebSocket clients.
     *
     * @param text The String to send across the network.
     * @throws InterruptedException When socket related I/O errors occur.
     */
    public void sendToAll(String text) {
        Collection<WebSocket> con = connections();
        synchronized (con) {
            for (WebSocket c : con) {
                c.send(text);
            }
        }
    }

    public void sendToAdmin(String text) {
        synchronized (adminFeed) {
            for (WebSocket c : adminFeed) {
                if (c.isOpen())
                    try {
                        c.send(text);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        }
    }

    public void sendToSubscribers(String text, Channel channelInfo) {
        synchronized (channelInfo.wsSubscribers) {
            Iterator<WebSocket> iterator = channelInfo.wsSubscribers.iterator();
            while (iterator.hasNext()) {
                WebSocket element = iterator.next();

                if (element.isOpen()) {
                    try {
                        element.send(text);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    iterator.remove();
                }


            }

        }
    }
}
TOP

Related Classes of net.bashtech.geobot.WSServer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.