pom.xml引入依赖,如果没有用maven,在lib里加入相应jar即可
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.0.1.RELEASE</version>
<scope>provided</scope>
</dependency>
web端
<script type="text/javascript">
var websocket=null;
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:86/Maya_Map/websocketForMap");
}
else{
alert("当前浏览器不支持websocket,请更换浏览器");
}
//连接发生错误的回调方法
websocket.onerror = function(){
console.log("onError");
//开启时调用
websocket.onopen = function(event){
console.log("onopen");
};
//收到服务器返回时触发
websocket.onmessage = function(event){
//你要调用的方法
console.table(event.data);
//网页关闭前调用
window.onbeforeunload = function () {
closeWebSocket();
};
function closeWebSocket(){
console.log("close websocket");
websocket.close();
};
</script>
后台代码
如果想要做到,当执行某个操作的时候,触发websocket,那么就在你执行那个操作的时候调用sendMap(map);或者sendMessage(message)直接发送数据就行。
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.annotation.Resource;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Controller;
import com.controller.base.BaseController;
import com.pojo.EncoderClassVo;
import com.pojo.MapVo;
import com.service.TimewayForMapService;
//如果需要向web端传递复杂数据,则需要自定义编码器,encoders={EncoderClassVo.class},(具体的会在下篇博客讲到。)如果只是传递简单的字符串则不需要,下面注解只写@ServerEndpoint(value="/websocketForMap")即可
@Controller("socketController")
@ServerEndpoint(value="/websocketForMap",encoders={EncoderClassVo.class})
public class WebsocketForMap extends BaseController{
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
private static CopyOnWriteArraySet<WebsocketForMap> webSocketSet
=new CopyOnWriteArraySet<WebsocketForMap>();
//与某个客户端的链接会话,需要通过他来给客户端发送数据
private Session session;
/**
* 连接建立成功调用的方法
* @param session 可选参数,当连接建立成功通过session、传输数据
* @throws IOException
* @throws EncodeException
*/
@OnOpen
public void onOpen(Session session) throws EncodeException, IOException{
this.session=session;
webSocketSet.add(this);//加入set中
addOnLineCount();//在线人数加一
System.out.println("websocket 开始了");
}
@OnClose
public void onClose(){
System.out.println("websocket 关闭了");
webSocketSet.remove(this);
subOnLineCount();
}
/**
* 接到消息时调用
* @param message
* @param session
* @throws IOException
* @throws EncodeException
*/
@OnMessage
public void onmessage(String message) throws EncodeException, IOException{
logger.info("客户端发来的消息"+message);
//这里写当你接收到客户端发来的数据,要做的一些操作,你可以直接调下面的sendMap(map);或者sendMessage(message)来传递信息,也可以引用其他类里的方法,具体实现,和平常一样,用 @Resource(name="******")引入接口,然后调用接口里的方法即可
}
/**
* 出现问题时调用
*/
@OnError
public void onerror(Throwable t) throws Exception{
logger.info("客户端发生错误");
}
/**
*
*自己定义的方法
*/
public static void sendMessage(String message) throws IOException, EncodeException{
for (WebsocketForMap client : webSocketSet) {
try {
synchronized (client) {
client.session.getBasicRemote().sendObject(message);
}
} catch (IOException e) {
//log.debug("Chat Error: Failed to send message to client", e);
webSocketSet.remove(client);
try {
client.session.close();
} catch (IOException e1) {
e1.printStackTrace();
}
String errorMessage = String.format("* %s %s",
"has been disconnected.");
sendMessage(errorMessage);
}
}
}
public static void sendMap(Map map) throws EncodeException, IOException {
for (WebsocketForMap client : webSocketSet) {
try {
synchronized (client) {
client.session.getBasicRemote().sendObject(map);
}
} catch (IOException e) {
//log.debug("Chat Error: Failed to send message to client", e);
webSocketSet.remove(client);
try {
client.session.close();
} catch (IOException e1) {
e1.printStackTrace();
}
String message = String.format("* %s %s",
"has been disconnected.");
sendMessage(message);
}
}
}
public static synchronized int getOnLineCount(){
return onlineCount;
}
public static synchronized void addOnLineCount(){
WebsocketForMap.onlineCount++;
}
public static synchronized void subOnLineCount(){
WebsocketForMap.onlineCount--;
}
}
本文介绍了如何在Java Web项目中使用WebSocket,包括在pom.xml添加依赖,以及客户端和服务器端的简单实现。通过调用sendMap或sendMessage方法,可以在执行特定操作时实时推送数据。

2032

被折叠的 条评论
为什么被折叠?



