tomcat8+websocket演示

Easter79
• 阅读 785

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还在测试。

参考文档:

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

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

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

package org.sl.action;

//import org.apache.log4j.Logger;

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

/**
 * Created by shanl on 14-4-14.
 */
@ServerEndpoint(value="/chatendpoint")
public class ChatEndpoint {
    //static final Logger logger = Logger.getLogger(ChatEndpoint.class);
    static Map<String,Session> sessionMap = new Hashtable<String,Session>();

    @OnOpen
    public void start(Session session){
        System.out.println("Guest"+session.getId()+" join");
        sessionMap.put(session.getId(), session);
        broadcast("Guest" + session.getId() + " join.");
    }

    @OnMessage
    public void process(Session session, String message){
        System.out.println(session.getId()+" say: " + message);
        broadcast("Guest"+session.getId()+" [say]: "+message);
    }


    @OnClose
    public void end(Session session){
        System.out.println("Guest"+session.getId()+" out.");
        sessionMap.remove(session.getId());
        broadcast("Guest"+session.getId()+ " out.");
    }

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

    void broadcast(String message){
        RemoteEndpoint.Basic remote = null;
        Set<Map.Entry<String,Session>> set = sessionMap.entrySet();
        for(Map.Entry<String,Session> i: set){
            remote = i.getValue().getBasicRemote();
            try {
                remote.sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

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);
    }
}

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("<html>");
        out.println("<body>");
        out.println("Hello world"+"<br />");
        out.println("name :"+config.getInitParameter("name")+"<br/>");
        out.println("session id :"+session.getId());
        out.println("</body>");
        out.println("</html>");
        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<String> {
        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());
    }

}

<!DOCTYPE html>
<html>
<head>
    <title>echoendpoint.html</title>
    <script language="JavaScript">
        var wsuri = "ws://localhost:8080/echoendpoint";
        var ws = null;

        function connectEndpoint(){
            ws = new WebSocket(wsuri);
            ws.onmessage = function(evt) {
                //alert(evt.data);
                document.getElementById("echo").value = evt.data;
            };

            ws.onclose = function(evt) {
                //alert("close");
                document.getElementById("echo").value = "end";
            };

            ws.onopen = function(evt) {
                //alert("open");
                document.getElementById("echo").value = "open";
            };
        }

        function sendmsg(){
            ws.send(document.getElementById("send").value);
        }
    </script>
</head>
<body onload="connectEndpoint()">
    <input type="text" size="20" value="5" id="send"> <input type="button" value="send" onclick="sendmsg()"> <br>
    <input type="text" id="echo">
</body>
</html>

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>websocket1.html</title>
    <script type="text/javascript">
        var wsuri = "ws://localhost:8080/Websocket1Action";
        var ws = null;
        function startWebSocket() {
            if ('WebSocket' in window)
                ws = new WebSocket(wsuri);
            else if ('MozWebSocket' in window)
                ws = new MozWebSocket(wsuri);
            else
                alert("not support");


            ws.onmessage = function(evt) {
                alert(evt.data);
            };

            ws.onclose = function(evt) {
                alert("close");
            };

            ws.onopen = function(evt) {
                alert("open");
            };
        }

        function sendMsg() {
            ws.send(document.getElementById('writeMsg').value);
        }
    </script>
</head>
<body onload="startWebSocket();">
<input type="text" id="writeMsg"/>
<input type="button" value="send" onclick="sendMsg()"/>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>websocket2.html</title>
    <script type="text/javascript">
        var wsuri = "ws://localhost:8080/Websocket2/";
        var ws = null;
        function startWebSocket() {
            if ('WebSocket' in window)
                ws = new WebSocket(wsuri);
            else if ('MozWebSocket' in window)
                ws = new MozWebSocket(wsuri);
            else
                alert("not support");


            ws.onmessage = function(evt) {
                alert(evt.data);
            };

            ws.onclose = function(evt) {
                alert("close");
            };

            ws.onopen = function(evt) {
                alert("open");
            };
        }

        function sendMsg() {
            ws.send(document.getElementById('writeMsg').value);
        }
    </script>
</head>
<body onload="startWebSocket();">
<input type="text" id="writeMsg"/>
<input type="button" value="send" onclick="sendMsg()"/>
</body>
</html>

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index.jsp</title>
  </head>
  <body>
    index.jsp<br/>
    <a href="https://my.oschina.net/HelloAction">HelloAction</a> <br>
    <a href="https://my.oschina.net/WebsocketAction">WebsocketAction</a>  <br>
    <a href="websocket1.html">websocket1.html</a>  <br>
    <a href="websocket2.html">websocket2.html</a>  <br>
    <a href="echoendpoint.html">echoendpoint.html</a>  <br>

  </body>
</html>

<!DOCTYPE html>
<html>
<head>
    <title>chatendpoint.html</title>
    <script language="JavaScript">
        var wsuri = "ws://localhost:8080/chatendpoint";
        var ws = null;

        function connectEndpoint(){
            window.WebSocket = window.WebSocket || window.MozWebSocket;
            if (!window.WebSocket){
                alert("WebSocket not supported by this browser");
                return;
            }

            ws = new WebSocket(wsuri);
            ws.onmessage = function(evt) {
                //alert(evt.data);
                var old = document.getElementById("echo").value;
                document.getElementById("echo").value = old+evt.data+"\r\n";
            };

            ws.onclose = function(evt) {
                //alert("close");
                document.getElementById("echo").value = "server disconnect.\r\n";
            };

            ws.onopen = function(evt) {
                //alert("open");
                document.getElementById("echo").value = "connect server.\r\n";
            };
        }

        function sendmsg(){
            ws.send(document.getElementById("send").value);
        }
    </script>
</head>
<body onload="connectEndpoint()">
<input type="text" size="20" value="hi~" id="send"> <input type="button" value="send" onclick="sendmsg()"> <br>
<textarea id="echo"  rows="50" cols="50">
</textarea>
</body>
</html>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k