环境
JDK 1.7.0_79 Tomcat 7.0.57 Eclipse 4.5
jar 包
tomcat7-websocket.jar
websocket.api.jar
这两个jar包tomcat里面有,由于我是用的maven,刚一开始我把这两个jar包依赖到pom中的,所以在启动tomcat的时候会报错 (org.apache.catalina.deploy.WebXml addFilter)
最后我把这两个jar包直接加到了WEB-INF/lib下面,就不报错了。
代码
WebSocketConfig.java
public class WebSocketConfig implements ServerApplicationConfig {
@Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scan) {
System.out.println("config............"+scan.size());
//返回 过滤作用
return scan;
}
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> arg0) {
return null;
}
}
EchoSocket.java
@ServerEndpoint("/echo")
public class EchoSocket {
@OnOpen
public void open(Session session){
System.out.println(session.getId());
}
@OnClose
public void close(Session session){
System.out.println("sessionId:"+session.getId()+"关闭了!");
}
@OnMessage
public void message(Session session, String msg){
System.out.println("客户端信息:"+msg);
try {
session.getBasicRemote().sendText("客户端说:I'm fine thank you!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
JS代码
<script type="text/javascript">
var ws;
var target = "ws://localhost:8888/irevisit-web/echo";
function subOpen(){
if ('WebSocket' in window) {
ws = new WebSocket(target);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(target);
} else {
alert('WebSocket is not supported by this browser.');
return;
}
ws.onmessage = function(event){
console.info(event.data);
var dv = document.getElementById("dv");
dv.innerHTML+="<p>"+event.data+"</p></br>";
};
}
function subSend(){
var msg = document.getElementById("msg").value;
ws.send(msg);
document.getElementById("msg").value = "";
}
</script>
<body>
<span style="white-space:pre"> </span><button οnclick="subOpen();">open</button>
<span style="white-space:pre"> </span><input id="msg"><button οnclick="subSend();">Send</button>
<span style="white-space:pre"> </span><div id="dv"></div>
</body>
<span style="white-space:pre"> </span>还有一个问题 , 就是项目配置的拦截把websoket的请求给拦截了 , 后来在web.xml里面加了一句
<span style="white-space:pre"> <servlet-mapping>
<span style="white-space:pre"> </span><servlet-name>default</servlet-name>
<span style="white-space:pre"> </span><url-pattern>/echo</url-pattern>
<span style="white-space:pre"> </span></servlet-mapping></span>