tomcat8+websocket演示

参考文档:

http://wenku.baidu.com/view/4e3d2d34915f804d2a16c119.html

http://tools.ietf.org/html/rfc6455

http://www.infoq.com/cn/news/2013/07/ee7-websocket-support


tomcat8真正支持jsr-356(包含对websocket的支持), tomcat7部分版本的websocket实现不兼容jsr-356。

需要注意websocket与浏览器的兼容问题,有些早期版本的浏览器支持旧版本的websocket协议,可能会与新版本的websocket不兼容。 博主采用"chrome 版本 33.0.1750.117 m"测试。

据称websocket还会有变动,甚至可能从html5中独立出来,所以不保证当前代码在未来也能执行。

由于博主所用的eclipse不支持tomcat8,所以采用idea 13 开发(tomcat8.0.3+jdk7+servlet 3.0)。


Endpoint的session,并不是servlet的session,Endpoint的session更象是独立的记数,Endpoint如何使用servlet的session还在测试。


package org.sl.action;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by shanl on 14-3-2.
 */
@WebServlet(name="HelloAction" ,urlPatterns={"/HelloAction"},loadOnStartup=1,
        initParams={
                @WebInitParam(name="name",value="xiazdong"),
                @WebInitParam(name="age",value="20")
})
public class HelloAction extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig config = getServletConfig();
        HttpSession session = request.getSession();
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("");
        out.println("Hello world"+"
"); out.println("name :"+config.getInitParameter("name")+"
"); out.println("session id :"+session.getId()); out.println(""); out.println(""); out.close(); } }

package org.sl.action;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * Created by shanl on 14-3-2.
 */
//@ServerEndpoint(value = "/Websocket1Action")
public class Websocket1Action extends Endpoint {
    private Session session;
    //private static final Logger sysLogger = Logger.getLogger("sysLog");
    @Override
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("onClose");
    }

    @Override
    public void onError(Session session, java.lang.Throwable throwable) {
        System.out.println("onError");
    }

    @Override
    public void onOpen(Session session, EndpointConfig config) {
        //sysLogger.info("*** WebSocket closed from sessionId " + this.session.getId());
        RemoteEndpoint.Basic remote =  session.getBasicRemote();

        System.out.println("pathParams:"+session.getPathParameters());
        System.out.println("requestParams"+session.getRequestParameterMap());
        session.addMessageHandler(new MyMessageHandle(remote));
        /***
        try{
            System.out.println("onOpen");
            //System.out.println(session.getQueryString());
            System.out.println(session.getRequestParameterMap());
            session.getBasicRemote().getSendWriter().write("success");
            //session.getBasicRemote().sendText("success");
        }catch(Exception ex){
            ex.printStackTrace();
        }
         ***/
    }

    private class MyMessageHandle implements MessageHandler.Whole {
        RemoteEndpoint.Basic remote =  null;
        public MyMessageHandle(RemoteEndpoint.Basic remote){
            this.remote = remote;
        }

        @Override
        public void onMessage(String s) {
            try {
                remote.sendText("success");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

package org.sl.action;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * Created by shanl on 14-3-2.
 */
@ServerEndpoint(value = "/Websocket2")
public class Websocket2Action {
    private Session session;
    //private static final Logger sysLogger = Logger.getLogger("sysLog");

    @OnOpen
    public void open(Session session,EndpointConfig config) {
        this.session = session;

        //sysLogger.info("*** WebSocket opened from sessionId " + session.getId());
    }

    @OnMessage
    public void inMessage(Session session,String message) {
        //sysLogger.info("*** WebSocket Received from sessionId " + this.session.getId() + ": " + message);
        System.out.println("rece:"+message);
        try {
            session.getBasicRemote().sendText("success");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnClose
    public void end(Session session) {
        //sysLogger.info("*** WebSocket closed from sessionId " + this.session.getId());
    }

}

package org.sl.action;

import org.omg.CosNaming._NamingContextExtStub;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

/**
 * Created by shanl on 14-3-3.
 */
@ServerEndpoint(value="/echoendpoint")
public class EchoEndpoint {
    @OnOpen
    public void start(Session session){
        System.out.println("session "+session.getId()+" open.");
    }

    @OnMessage
    public void process(Session session, String message){
        System.out.println("rece:" + message);
        RemoteEndpoint.Basic remote = session.getBasicRemote();
        int c = Integer.valueOf(message);
        for (int i=1; i<=c; i++){
            try {
                remote.sendText("response "+i);
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @OnClose
    public void end(Session session){
        System.out.println("session "+session.getId()+" close.");
    }

    @OnError
    public void error(Session session, java.lang.Throwable throwable){
        System.err.println("session "+session.getId()+" error:"+throwable);
    }
}




<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  
    index.jsp
  
  
    index.jsp
HelloAction
WebsocketAction
websocket1.html
websocket2.html
echoendpoint.html




    
    websocket1.html
    









    
    websocket2.html
    









    echoendpoint.html
    


      



你可能感兴趣的:(websocket)