java 用webScoket扫描登录

我用的是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(),"登录成功”);//发个客户端某一用户
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值