美文网首页Snippet
最简单的java websocket demo

最简单的java websocket demo

作者: higher2017 | 来源:发表于2016-12-28 11:41 被阅读676次

    本demo参考至:《Java WebSocket编程开发、部署和保护动态Web应用》

    服务端代码:

    import java.io.IOException;
    import java.util.Set;
    import java.util.concurrent.CopyOnWriteArraySet;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import javax.websocket.OnClose;
    import javax.websocket.OnError;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;
    
    import org.apache.log4j.Logger;
    
    /**
     * 该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。 相当于SpringMVC的@RequestMapping("/*")注解
     * 
     * @author higher2016
     * @2016-12-28
     */
    @ServerEndpoint("/echo")
    public class EchoController {
    
        private static final Logger logger = Logger.getLogger(EchoController.class);
    
        private static final String GUEST_PREFIX = "Guest";
        private static final AtomicInteger connectionIds = new AtomicInteger(0);
        private static final Set<EchoController> connections = new CopyOnWriteArraySet<EchoController>();
    
        private final String nickname;
        private Session session;
    
        public EchoController() {
            nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
        }
    
        @OnOpen
        public void start(Session session) {
            this.session = session;
            connections.add(this);
            String message = String.format("* %s %s", nickname, "has joined.");
            broadcast(message);
        }
    
        @OnClose
        public void end() {
            connections.remove(this);
            String message = String.format("* %s %s", nickname, "has disconnected.");
            broadcast(message);
        }
            
        /**
         * 收到客户端消息后调用的方法
         * 
         * @param incomingMessage
         *            客户端发送过来的消息
         */
        @OnMessage
        public void incoming(String message) {
            String filteredMessage = String.format("%s: %s", nickname, message.toString());
            broadcast(filteredMessage);
        }
    
        @OnError
        public void onError(Throwable t) throws Throwable {
            logger.error("Chat Error: " + t.toString(), t);
        }
    
        private static void broadcast(String msg) {
            for (EchoController client : connections) {
                try {
                    synchronized (client) {
                        client.session.getBasicRemote().sendText(msg);
                    }
                } catch (IOException e) {
                    logger.debug("Chat Error: Failed to send message to client", e);
                    connections.remove(client);
                    try {
                        client.session.close();
                    } catch (IOException e1) {
                    }
                    String message = String.format("* %s %s", client.nickname, "has been disconnected.");
                    broadcast(message);
                }
            }
        }
    }
    

    客户端jsp:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Apache Tomcat WebSocket Examples: Chat</title>
        <style type="text/css">
            input#chat {
                width: 410px
            }
    
            #console-container {
                width: 400px;
            }
    
            #console {
                border: 1px solid #CCCCCC;
                border-right-color: #999999;
                border-bottom-color: #999999;
                height: 170px;
                overflow-y: scroll;
                padding: 5px;
                width: 100%;
            }
    
            #console p {
                padding: 0;
                margin: 0;
            }
        </style>
        <script type="text/javascript">
            var Chat = {};
    
            Chat.socket = null;
    
            Chat.connect = (function(host) {
                if ('WebSocket' in window) {
                    Chat.socket = new WebSocket(host);
                } else if ('MozWebSocket' in window) {
                    Chat.socket = new MozWebSocket(host);
                } else {
                    Console.log('Error: WebSocket is not supported by this browser.');
                    return;
                }
    
                Chat.socket.onopen = function () {
                    Console.log('Info: WebSocket connection opened.');
                    document.getElementById('chat').onkeydown = function(event) {
                        if (event.keyCode == 13) {
                            Chat.sendMessage();
                        }
                    };
                };
    
                Chat.socket.onclose = function () {
                    document.getElementById('chat').onkeydown = null;
                    Console.log('Info: WebSocket closed.');
                };
    
                Chat.socket.onmessage = function (message) {
                    Console.log(message.data);
                };
            });
    
            Chat.initialize = function() {
                if (window.location.protocol == 'http:') {
                    Chat.connect("ws://localhost:8080/Mybatis/echo");
                } else {
                    Chat.connect("wss://localhost:8080/Mybatis/echo");
                }
            };
    
            Chat.sendMessage = (function() {
                var message = document.getElementById('chat').value;
                if (message != '') {
                    Chat.socket.send(message);
                    document.getElementById('chat').value = '';
                }
            });
    
            var Console = {};
    
            Console.log = (function(message) {
                var console = document.getElementById('console');
                var p = document.createElement('p');
                p.style.wordWrap = 'break-word';
                p.innerHTML = message;
                console.appendChild(p);
                while (console.childNodes.length > 25) {
                    console.removeChild(console.firstChild);
                }
                console.scrollTop = console.scrollHeight;
            });
    
            Chat.initialize();
    
        </script>
    </head>
    <body>
    <noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable
        Javascript and reload this page!</h2></noscript>
    <div>
        <p>
            <input type="text" placeholder="type and press enter to chat" id="chat">
        </p>
        <div id="console-container">
            <div id="console"></div>
        </div>
    </div>
    </body>
    </html>
    
    最终效果图

    相关文章

      网友评论

        本文标题:最简单的java websocket demo

        本文链接:https://www.haomeiwen.com/subject/fsryvttx.html