java 用webScoket扫描登录

来源:互联网 发布:jquery获取表格数据 编辑:程序博客网 时间:2024/06/07 01:10

我用的是spring4.0,tomcat7 ,jdk1.7

****  jdk太低的不行 tomcat6以下好像也不行

jar包  websocket-api.jar(网上都有)


js代码



var websocket=mull;

var code=new Date();//唯一标识符

  •  //判断当前浏览器是否支持WebSocket  
  •     if ('WebSocket' in window) {  
  •         websocket = new WebSocket("ws://localhost:8080/websocket/echo/{code}");  ////有时候会报404    websocket是指你的项目名
  •     }  
  •     else {  
  •         alert('当前浏览器 Not support websocket')  
  •     }  
  •   
  •     //连接发生错误的回调方法  
  •     websocket.onerror = function () {  
  •         setMessageInnerHTML("WebSocket连接发生错误");  
  •     };  
  •   
  •     //连接成功建立的回调方法  
  •     websocket.onopen = function () {  
  •         setMessageInnerHTML("WebSocket连接成功");  
  •     }  
  •   
  •     //接收到消息的回调方法  
  •     websocket.onmessage = function (event) {  
  •         setMessageInnerHTML(event.data);  
  •     }  
  •   
  •     //连接关闭的回调方法  
  •     websocket.onclose = function () {  
  •         setMessageInnerHTML("WebSocket连接关闭");  
  •     }  
  •   
  •     //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
  •     window.onbeforeunload = function () {  
  •         closeWebSocket();  
  •     }  
  •   
  •     //将消息显示在网页上  
  •     function setMessageInnerHTML(innerHTML) {  
  •         document.getElementById('message').innerHTML += innerHTML + '<br/>';  
  •     }  
  •   
  •     //关闭WebSocket连接  
  •     function closeWebSocket() {  
  •         websocket.close();  
  •     }  
  •   
  •     //发送消息  
  •     function send() {  
  •         var message = document.getElementById('text').value;  
  •         websocket.send(message); 
  •     } 

    服务端


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


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


    @ServerEndpoint("/echo/{code}")
    public class EchoSocket {

    //把所有的session保存到map中
    private static final List<Map<String, Session>> map = new ArrayList<Map<String, Session>>();
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    //若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    private Session session;
    /**
         * 客户端有连接的时候就会调用这个方法
         */
        @OnOpen
        public void open(Session session,@PathParam("code") String code){
        Map<String, Session> user = new HashMap<String, Session>();
        user.put(code, session);//把客户端的session信息保存
        map.add(user);
        System.out.println("连接成功++++"+code);
            try {
    session.getBasicRemote().sendText("1001,连接成功");
    } catch (IOException e) {
    e.printStackTrace();
    }
        }
        /**
         * 客户端连接断开就会调用此方法
         */
        @OnClose
        public void close(Session session,@PathParam("code") String code){
            System.out.println(code + "连接关闭了");
            map.remove(code);//关闭时map中移除
        }
        
        /**
         * 接收到客户端的信息
         * @param msg
         * @param last
         */
        @OnMessage
        public void message(Session session,boolean last,@PathParam("code") String code){
            System.out.println("客户端说" + code);
        }


         /**
         *错误监听(当没有关闭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之间的通信不会共享成员变量
          }
          /**
         * 给某个用户发送消息
         * @param userName
         * @param textMessage
         */
          public void sendMessageToUser(String index, String message) {
            for (Map<String, Session> map1 : map) {
               if (map1.containsKey(index)) {
               try {
    map1.get(index).getBasicRemote().sendText(message);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
            }
        }


    }

    怎么在api中调用呢???????

    @Controller
    @RequestMapping("we")
    public class ScanningGenController {
    private Log logger = LogFactory.getLog(this.getClass());

    @Autowired
    private IScanningGenService scanningGenService;

    @Autowired
    private IUserInfoService userInfoService;
    @Bean
    public EchoSocket webSocketHandler() {
            return new EchoSocket();
    }

    @ResponseBody
    @RequestMapping("/a
    ddcode")
    public Result addScanningGen(Map<String, Object> params) {

    //自己的业务代码


    webSocketHandler().sendMessageToUser(params.get("code").toString(),"登录成功”);//////发个客户端某一用户
    }

    }

  • 原创粉丝点击