websocket Tomcat JSP Demo

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>WebSocket示例</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
      <button onclick="subOpen();">open</button><br/>
      <input type="text" name="msg" id="msg"><br/>
      <button onclick="send();">发送</button>
      <div id="div"></div>
  
  </body>
  
  <script type="text/javascript">
      var ws; // 就是一个通信管道
      var target = "ws://localhost:8080/WebsocketTest/echo";//服务端的url,注意以ws开头
      function subOpen(){
          //三个判断用于获取ws通信管道(浏览器兼容)
          if('WebSocket' in window){
              ws = new WebSocket(target);
          }else if('MozWebSocket' in window){
              ws = new MozMozWebSocket(target);
          }else{
              alert("WebSocket is not supported by this browse");
              return;
          }
          //ws.onopen = function(){}  链接开启会执行方法
          //ws.onclose = function(){}  断开连接会执行方法
          //以上两个实际用处并不多,主要是下面的
          //服务器又信息返回就执行方法
          ws.onmessage=function(event){
              //服务端一返回内容,就把该内容放到div标签当中
              document.getElementById("div").innerHTML = event.data;
              
              //方便在控制台查看返回内容的具体信息
              console.info(event);
          };
      };
      
      function send(){
          //点击发送按钮就把输入框里的内容发送给服务器,并把输入框的内容清空
          var msg = document.getElementById("msg").value;
          ws.send(msg);
          document.getElementById("msg").value = "";
      };
      
  </script>
  
</html>
package Test;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.CloseReason;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

//注解规定了访问的URL
@ServerEndpoint("/echo")
public class EchoSocket {
    /**
     * 客户端有连接的时候就会调用这个方法
     */
    @OnOpen
    public void open(Session session, EndpointConfig config){
        
        System.out.println(session.getId()+"#############");
    }
    /**
     * 客户端连接断开就会调用此方法
     */
    @OnClose
    public void close(Session session,CloseReason reason){
        System.out.println(session.getId() + "连接关闭了");
    }
    
    /**
     * 接收到客户端的信息
     * @param msg
     * @param last
     */
    @OnMessage
    public void message(Session session,boolean last,String msg){
        System.out.println("客户端说" + msg);
        try {
            session.getBasicRemote().sendText("ni hao too");
            Thread.sleep(3000);//三秒后再发送一条信息,用于验证是否实现数据实时更新
            session.getBasicRemote().sendText("ni hao too twice");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


     /**
     *错误监听(当没有关闭socket连接就关闭浏览器会异常)
     */
      @OnError
      public void error(Session session, Throwable error){
           String id = session.getId();
           System.out.println("出错的session的id是" + id);
      }
public EchoSocket(){
        System.out.println("Socket对象创建");
        //通过对象的创建可以知道不同socket之间的通信不会共享成员变量
    }
}
posted @ 2018-12-03 14:38  zhaocundang  阅读(664)  评论(0编辑  收藏  举报