WebSokect 简单案例

前言:最近有一个项目用到了websokect,小小学习了一下websokect,本来一天内能搞定的,结果花了三天。代码没错,就是执行不起来,后来发现了,我的JDK是6的。造成运行不起来。
- 环境介绍
1. JDK7(必须) + TOMCAT7(最好7.05以上)
备注:多啰嗦一句,JDK最少要JDK7,如果是eclipse运行,里面的tomcat的java编译设置也需要设置成JDK7,就是因为我没设置tomcat的编译的JDK版本导致运行不起来。多花费了我几个小时。

废话不多说,直接上代码


maven配置:

<dependency>
    <groupId>javaxgroupId>
    <artifactId>javaee-apiartifactId>
    <version>7.0version>
    <scope>providedscope>
dependency>

java后台代码:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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("/myWebSokect")
public class MyWebSokect {

    private static int countPer = 0;

    private Session session;

    private static List webSokects = new ArrayList();

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSokects.add(this);
        addCountPer();
        System.out.println("当前在线人数:"+getCountPer());
    }

    @OnClose
    public void onClose() {
        webSokects.remove(this);
        removeCountPer();
        System.out.println("当前在线人数:"+getCountPer());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 消息群发
        for(MyWebSokect webSoekct : webSokects) {
            try {
                // 这个或许不好理解
                // this.session.getBasicRemote().sendText(message);
                // 修改称这个就好理解了
                webSoekct.getSession().getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @OnError
    public void onError(Session session, Throwable error) {
        removeCountPer();
        System.out.println("websokect error()");
    }

    public void addCountPer() {
        MyWebSokect.countPer++;
    }

    public void removeCountPer() {
        MyWebSokect.countPer--;
    }

    public int getCountPer() {
        return countPer;
    }

    public Session getSession() {
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    public static void setCountPer(int countPer) {
        MyWebSokect.countPer = countPer;
    }

}

JSP代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


<html>
  <head>
    <base href="<%=basePath%>">
    <title>My WebSockettitle>
  head>

  <body>
    Welcome<br/>
    <input id="text" type="text" />
    <button onclick="send()">Sendbutton>    
    <button onclick="closeWebSocket()">Closebutton>
    <div id="message">

    div>
  body>

  <script type="text/javascript">
      var websocket = null;

      //判断当前浏览器是否支持WebSocket
      if('WebSocket' in window){
          websocket = new WebSocket("ws://localhost:8080/websokectTest/myWebSokect");
      }
      else{
          alert('Not support websocket');
      };

      //连接发生错误的回调方法
      websocket.onerror = function(){
          setMessageInnerHTML("error");
      };

      //连接成功建立的回调方法
      websocket.onopen = function(event){
          setMessageInnerHTML("open");
      };

      //接收到消息的回调方法(在火狐中event会出错,报没有定义event)
      websocket.onmessage = function(){
          setMessageInnerHTML(event.data);
      };

      //连接关闭的回调方法
      websocket.onclose = function(){
          setMessageInnerHTML("close");
      };

      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
      window.onbeforeunload = function(){
          websocket.close();
      };

      //将消息显示在网页上
      function setMessageInnerHTML(innerHTML){
          document.getElementById('message').innerHTML += innerHTML + '
'
; }; //关闭连接 function closeWebSocket(){ websocket.close(); }; //发送消息 function send(){ var message = document.getElementById('text').value; websocket.send(message); };
script> html>

测试通过环境:
谷歌浏览器

备注:用火狐的时候jsp里面有一个event变量,火狐里面不能用。会报错。说event没有定义。这个地方交给你们去完善了。哈哈。

你可能感兴趣的:(WEB前端,Java基础)