JavaEE07-WebSocket支持

WebSocket的Java服务器端编程

服务器端

WebSocket服务器端程序

package ws;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
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;

@ServerEndpoint("/endpoint")
public class WSEndpoint {

    Session session; //javax.websocket.Session 当前会话

    @OnMessage
    public String onMessage(Session session,String message) {
        System.out.println(message);
        try {
            session.getBasicRemote().sendText(message + "世界,你好!");
        } catch (IOException ex) {
            Logger.getLogger(WSEndpoint.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "Hello,world!";
    }

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //告诉StartServlet当前的websocket会话对象. 
        //用于StartServlet发信息给websocket网页端
        StartServlet.session = session;  
        System.out.println("onOpen");
    }

    @OnError
    public void onError(Throwable t) {
        System.out.println("onError");
        System.out.println(t);
    }

    @OnClose
    public void onClose() {
        System.out.println("onClose");
    }
}

服务器端向websocket session标识的浏览器端发送信息

package ws;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.Session;

@WebServlet(name = "StartServlet", urlPatterns = {"/StartServlet"})
public class StartServlet extends HttpServlet {

    public static Session session;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            if (session != null) {
                session.getBasicRemote().sendText("世界,你好!从StartServlet刷新而来的信息!");
            }
        } catch (IOException ex) {
            Logger.getLogger(WSEndpoint.class.getName()).log(Level.SEVERE, null, ex);
        }
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet StartServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>刷新页面, 服务器会向WebSocket页面发送信息.</h1>");
            out.println("<h1>Servlet StartServlet at "+request.getRequestURL() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}

浏览器端程序

浏览器端页面是标准的HTML5页面. 采用JavaScript编写WebSocket程序. 文件内容如下:

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="application/javascript">
            var ws;
            function connect() {
                var target = document.getElementById('target').value;
                if (target == '') {
                    alert('Please select server side connection implementation.');
                    return;
                }
                if ('WebSocket' in window) {
                    ws = new WebSocket(target);
                } else if ('MozWebSocket' in window) {
                    ws = new MozWebSocket(target);
                } else {
                    alert('WebSocket is not supported by this browser.');
                    return;
                }
                log('websocket opened.');

                ws.onopen = function () {
                    document.getElementById('message').value = "connected";
                    log('Info: WebSocket connection opened.');
                };
                ws.onmessage = function (event) {
                    log('Received: ' + event.data);
                };
                ws.onclose = function (event) {
                    log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason));
                };
            }

            function disconnect() {
                if (ws != null) {
                    ws.close();
                    ws = null;
                }
            }

            function log(message) {
                document.getElementById('message').innerHTML += message + '<br>';
            }
            function send(){
                var message = document.getElementById('send').value;
                ws.send(message);
            }

        </script>

    </head>
    <body>
        <input id="target" type="text" name="target" value="ws://localhost:8080/WebsocketDemo/endpoint"  size="200"/>
        <div id="message" > TODO write content </div>
        <input type="submit" value="连接" onclick="connect()" />
        <br/>
        <input id="send" type="text" name="send" value=""  size="200"/>
        <input type="submit" value="发送" onclick="send()" />
        <input type="submit" value="关闭" onclick="disconnect()" />
    </body>
</html>

运行结果

运行结果1
运行结果1
运行结果2
运行结果2
运行结果3
运行结果3
运行结果4, 启动StartServlet, 每次刷新都向WebSocket客户端网页发送信息
运行结果4
运行结果5, WebSocket客户端网页收到服务器端主动发送的信息
运行结果5

猜你喜欢

转载自blog.csdn.net/dlutcat/article/details/80237936