前言
上回说到,利用vite加载不同mode下的配置文件,可以实现不同运行环境下的参数配置。在前端应用中经常使用到Websocket,其地址同样可以在.env中间中配置。
代码
vite.config.ts代码的执行是在createApp之前,不可以在vite.config.ts中使用例如pinia
、router
等组件。可以使用import.meta.env获取配置文件中的参数
废话少说,直接上代码。
前端
.env.development
# 开发环境配置
NODE_ENV='development'
# 本地服务端口
VITE_PORT=8093
.......
# Websocket服务地址
VITE_WS_URL='ws://localhost:8083'
demo.vue
const wsPath = import.meta.env.VITE_WS_URL + 'ws/demo';
let wsSocket: any;
function wsInit() {
if (typeof (WebSocket) === 'undefined') {
console.log("浏览器不支持websocket");
} else {
wsSocket = new WebSocket(wsPath);
wsSocket.onopen = open;
wsSocket.onerror = error;
wsSocket.onmessage = getMessage;
}
}
function open() {
console.log("websocket连接成功")
}
function error(error: string) {
console.log("websocket连接错误", error)
}
function getMessage(msg: MessageEvent) {
let states = msg.data;
states = JSON.parse(states);
states.forEach((dataItem: any) => {
});
}
function send(params: string) {
wsSocket.send(params)
}
function close(e: any) {
console.log("websocket连接关闭")
}
onMounted(() => {
wsInit();
})
onUnmounted(() => {
wsSocket.onclose = close;
})
后端
Websocket.config.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
DemoWebsocketServer.java
import io.micrometer.common.util.StringUtils;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
@ServerEndpoint(value = "/ws/demo")
public class DemoWebsocketServer {
private static ConcurrentHashMap<String, DemoWebsocketServer> webSocketMap = new ConcurrentHashMap<>();
@Getter
private Session session;
public String pointsUrl;
private static StringRedisTemplate stringRedisTemplate;
@Autowired
public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
DemoWebsocketServer.stringRedisTemplate = stringRedisTemplate;
}
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
log.info("{}连接成功", this.getSession());
webSocketMap.put(session.getId(), this);
sendMessage("");
}
@OnMessage
public void onMessage(String message) {
// todo 获取前端发送过来的
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
//从set中删除
webSocketMap.remove(this.getSession().getId());
log.info("断开连接" + this.getSession());
}
/**
* @param error
*/
@OnError
public void onError(Throwable error) {
if (error.getMessage().contains("Broken pipe")) {
log.info("客户端突然断开连接");
} else {
System.out.println("发生错误");
error.printStackTrace();
}
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) {
synchronized (webSocketMap) {
if (!StringUtils.isEmpty(this.getSession().getId()) && webSocketMap.containsKey(this.getSession()
.getId())) {
try {
webSocketMap.get(this.getSession().getId()).getSession().getBasicRemote().sendText(message);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
DemoWebsocketServer that = (DemoWebsocketServer) o;
return Objects.equals(session, that.session) && Objects.equals(pointsUrl, that.pointsUrl);
}
@Override
public int hashCode() {
return Objects.hash(session, pointsUrl);
}
}
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容