Tomcat中实现websocket和browser端访问
简介:
在tomcat 7.0.27版本后,实现了对websocket的支持。在最新的tomcat7.0.72后,websocket的开发变动更简单了
在tomcat中,websocket的支持有2个jar包提供:websocket-api.jar和tomcat-websocket.jar。
开发
实现websocket处理的类,可以继承javax.websocket.Endpoint;也可以使用注解来进行websocket服务的开发,这样更简单。
简单一个chat的示例:
package com.wssample;
import java.io.IOException;
import java.util.*;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/chatendpoint")
public class ChatEndpoint {
//static final Logger logger = Logger.getLogger(ChatEndpoint.class);
static Map<String,Session> sessionMap = new Hashtable<String,Session>();
@OnOpen
public void start(Session session){
System.out.println("Guest"+session.getId()+" join");
sessionMap.put(session.getId(), session);
broadcast("Guest" + session.getId() + " join.");
}
@OnMessage
public void process(Session session, String message){
System.out.println(session.getId()+" say: " + message);
broadcast("Guest"+session.getId()+" [say]: "+message);
}
@OnClose
public void end(Session session){
System.out.println("Guest"+session.getId()+" out.");
sessionMap.remove(session.getId());
broadcast("Guest"+session.getId()+ " out.");
}
@OnError
public void error(Session session, java.lang.Throwable throwable){
System.err.println("Guest" + session.getId() + " error: " + throwable);
end(session);
}
void broadcast(String message){
RemoteEndpoint.Basic remote = null;
Set<Map.Entry<String,Session>> set = sessionMap.entrySet();
for(Map.Entry<String,Session> i: set){
remote = i.getValue().getBasicRemote();
try {
remote.sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端开发,使用注解@ServerEndpoint,标示一个websocket服务端。注解参数value可以指定访问的路径。
在实现类中,使用注解@OnOpen,@OnClose, @OnMessage,@OnError来标示websocket生命周期的4个处理。
浏览器端
在浏览器端,使用js访问websocket访问,进行交互。
<!DOCTYPE html>
<html>
<head>
<title>chatendpoint.html</title>
<script language="JavaScript">
var wsuri = "ws://localhost:8080/WebSocket/chatendpoint";
var ws = null;
function connectEndpoint(){
window.WebSocket = window.WebSocket || window.MozWebSocket;
if (!window.WebSocket){
alert("WebSocket not supported by this browser");
return;
}
ws = new WebSocket(wsuri);
ws.onmessage = function(evt) {
//alert(evt.data);
var old = document.getElementById("echo").value;
document.getElementById("echo").value = old+evt.data+"\r\n";
};
ws.onclose = function(evt) {
//alert("close");
document.getElementById("echo").value = "server disconnect.\r\n";
};
ws.onopen = function(evt) {
//alert("open");
document.getElementById("echo").value = "connect server.\r\n";
};
}
function sendmsg(){
ws.send(document.getElementById("send").value);
}
</script>
</head>
<body onload="connectEndpoint()">
<input type="text" size="20" value="hi~" id="send"> <input type="button" value="send" onclick="sendmsg()"> <br>
<textarea id="echo" rows="50" cols="50">
</textarea>
</body>
</html>