我用的是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("/addcode")
public Result addScanningGen(Map<String, Object> params) {
//自己的業務代碼
webSocketHandler().sendMessageToUser(params.get("code").toString(),"登錄成功”);//////發個客戶端某一用戶
}
}