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(),"登錄成功”);//////發個客戶端某一用戶
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章