//服务端代码
//websocket地址
@ServerEndpoint("/ws")
public class WebSocket {
//记录连接的客户端session,采用线程安全集合
public static CopyOnWriteArraySet<Session> clients=new CopyOnWriteArraySet<Session>();
/**
* 服务端收到消息时触发的函数
* @param message
* @param session
* @throws Exception
*/
@OnMessage
public void OnMessage(String message,Session session) throws Exception{
System.out.println("Received:"+message);
session.getBasicRemote().sendText("I Know!!!");
}
/**
* 客户端连接成功时触发函数
* @param session
*/
@OnOpen
public void OnOpen(Session session){
System.out.println("A new client connected!!!");
clients.add(session);//记录客户端session
}
/**
* 客户端断开连接时触发函数
* @param session
*/
@OnClose
public void OnClose(Session session){
System.out.println("A client has disconnected!!!");
clients.remove(session);//移除离线的session
}
/**
* 发生异常时触发的函数
* @param session
* @param e
*/
@OnError
public void OnError(Session session,Throwable e){
System.out.println("An error triggered!!!");
e.printStackTrace();
}
}
前台代码
<body>
<h2 id="h"></h2>
<div id="div"></div>
<input type="button" value="send" οnclick="sendMsg();" />
<input type="button" value="closeWs" οnclick="closeWs();" />
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/ws");
//连接成功后前台触发的函数
ws.onopen = function () {
document.getElementById("h").innerHTML="websocket connected successful!!!";
};
//接收到后台推送的消息后触发的函数
ws.onmessage = function (evt) {
document.getElementById("div").innerHTML+=evt.data;
};
//websocket断开连接时触发的函数
ws.onclose = function (evt) {
document.getElementById("h").innerHTML="WebSocketClosed!";
};
//发生异常时触发的函数
ws.onerror = function (evt) {
document.getElementById("h").innerHTML="WebSocketError!";
};
function closeWs() {
if(ws)
ws.close();
}
function sendMsg(){
ws.send("I'm joined!!!");
}
</script>
</body>
添加maven依赖,注意scope要选成由容器提供,不随项目一起打包发布,因为tomcat中自带,否则不会出现想要的结果,但不会报错,tomcat8支持websocket,
tomcat7有几个小版本不支持,可以在lib目录下看一下是否有websocket-api.jar如果没有说明不支持,换版本吧
依赖包
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>