09.10 在javaee項目中使用WebSocket

首先,什麼是WebSocket,有興趣的朋友可以看看這裡:http://zh.wikipedia.org/zh-cn/WebSocket

對WebSocket有了基本認識後,我們可以著手開發WebSocket應用程序,推薦使用Maven搭建項目。我使用的服務器是Tomcat 7.0.56(Tomcat 7或者更高版本才能使用WebSocket,而且至少是7.0.47以上版本才支持, LZ一開始用7.0.41部署沒有成功...)。WebSocket 還需要javaee7的支持,所以在pom.xml中需要引用一下jar:


\t<dependency>
<groupid>javax/<groupid>
<artifactid>javaee-api/<artifactid>
<version>7.0/<version>
/<dependency>

<dependency>
<groupid>javax.websocket/<groupid>
<artifactid>javax.websocket-api/<artifactid>
<version>1.0/<version>
<scope>provided/<scope>
/<dependency>


<dependency>
<groupid>com.alibaba/<groupid>
<artifactid>fastjson/<artifactid>
<version>1.1.34/<version>
/<dependency>

因為Tomcat自帶了websocket-api,所以項目中的websocket-api是provided,方便編譯。

接著可以編寫服務端的WebSocket程序,示例代碼:


package com.jiepu.visuallab.web.servlet;

import com.alibaba.fastjson.JSON;
import com.jiepu.visuallab.common.C;
import com.jiepu.visuallab.common.bean.SocketReply;
import com.jiepu.visuallab.common.tools.HostTools;


import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
*
* Created by zengxm on 2014/11/4.
*/
@ServerEndpoint("/websocket/test")
public class HostWebSocketServlet {

private static Map<string> sessions = new HashMap<string>();

public HostWebSocketServlet(){
System.out.println("--------------------------------------");
}

/**
* 向客戶端群發信息
* @param category
* @param data
*/
public synchronized static void sendAll(String category, Object data){
SocketReply re = new SocketReply(category, data);
String replyStr = JSON.toJSONString(re);
System.out.println("開始群發信息!");
Set<string> keys = sessions.keySet();
for(String k:keys){
Session s = sessions.get(k);
if(s.isOpen()){
try{
s.getBasicRemote().sendText(replyStr);

System.out.println("發送成功, id="+k);
}catch(Exception e){
System.err.println("發送出錯:"+e.getMessage());
}
}
}
}

@OnMessage
public void onMessage(Session session, String msg){
System.out.println("收到信息");
try {

session.getBasicRemote().sendText("get");
}catch (Exception e){
e.printStackTrace();
}
}

@OnOpen
public void onOpen(Session session, EndpointConfig config){
try {
sessions.put(session.getId(), session);

SocketReply re = new SocketReply(C.HOST_DATA, HostTools.getHostList());
String replyStr = JSON.toJSONString(re);

session.getBasicRemote().sendText(replyStr);
}catch (Exception e){
e.printStackTrace();
}
}

@OnError
public void onError(Session session, Throwable throwable){

}

@OnClose
public void onClose(Session session, CloseReason reason){
try {
System.out.println("斷開連接, id="+session.getId());
synchronized (sessions){
sessions.remove(session.getId());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
/<string>/<string>/<string>

在html頁面中可以這樣連接到上面定義好的WebSocket:


var url = "ws://"+document.location.host+"${base}/websocket/test";
var ws = new WebSocket(url);

ws.onopen = function(e){
console.log("ws connect Success!");
HostUtil.start();


HostConsole.init();
listeners.push(HostConsole);
}

ws.onmessage = function(evt){
console.log("ws get:"+evt.data);
}

上面代碼中的${base}就是項目名稱,替換成實際的路徑即可。

將項目部署到tomcat,運行之,在console可以看到連接信息:

在javaee項目中使用WebSocket

總結:

1. 如果環境都搭建好了,運行項目也沒報錯,但是連接不了WebSocket(js端報404錯誤),可以看看是不是jar衝突了。就是項目lib裡面是不是有websocket-api相關的jar,有的話要刪除,不然會跟tomcat自帶的websocket衝突,導致服務端程序沒有執行。


分享到:


相關文章: