1?springboot
1.1 加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
1.2?WebSocketConfig 后端設(shè)置前端請求的網(wǎng)址,注冊請求的信息
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/websocket")
.setAllowedOrigins("*");
}
}
1.3?WebSocketHandler 數(shù)據(jù)處理與推送
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Executors;
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
System.out.println("WebSocket session opened: " + session.getId());
// + 在這里 加入 每秒 推送的消息
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(() -> {
try {
pushDateTimeToClients(); // 每秒調(diào)用這個方法處理數(shù)據(jù)
} catch (IOException e) {
e.printStackTrace();
}
}, 0, 1, TimeUnit.SECONDS);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("Received message from WebSocket client: " + message.getPayload());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
System.out.println("WebSocket session closed: " + session.getId());
}
public void pushDateTimeToClients() throws IOException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTimeString = dateFormat.format(new Date());
List<String> dataList = new ArrayList<>();
dataList.add(dateTimeString);
ObjectMapper objectMapper = new ObjectMapper();
String payload = objectMapper.writeValueAsString(dataList);
TextMessage message = new TextMessage(payload);
sessions.forEach(webSocketSession -> {
try {
webSocketSession.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
/**
* afterConnectionEstablished:
* 當(dāng)WebSocket客戶端連接到服務(wù)端時會觸發(fā)這個方法,我們將客戶端的WebSocketSession對象添加到sessions列表中。
* handleTextMessage: 當(dāng)WebSocket客戶端發(fā)送消息給服務(wù)端時會觸發(fā)這個方法,在這個示例中,我們暫時不需要處理這個消息。
* afterConnectionClosed:
* 當(dāng)WebSocket客戶端關(guān)閉連接時會觸發(fā)這個方法,我們需要將客戶端的WebSocketSession對象從sessions列表中移除。
* pushDateTimeToClients: 這個方法用于向所有連接到WebSocket服務(wù)端的客戶端推送當(dāng)前的日期時間信息。
*/
/**
* @Component: 該注解用于將WebSocketHandler類聲明為Bean,使其能夠被Spring容器管理,需要進(jìn)行依賴注入時直接注入該類即可。
* TextWebSocketHandler:
* 這是Spring框架提供的一個實(shí)現(xiàn)了WebSocketHandler接口的抽象類,用于處理文本類型的WebSocket消息。在實(shí)現(xiàn)WebSocketHandler接口時,一般繼承該類并重寫其中的方法。
* WebSocketSession:
* 該類表示W(wǎng)ebSocket連接的會話信息,包括連接ID、協(xié)議版本、URI等信息,可以通過該類實(shí)現(xiàn)向客戶端發(fā)送消息等功能,也可以獲取客戶端發(fā)送的消息等操作。
* CopyOnWriteArrayList:
* 該類是Java并發(fā)包中提供的線程安全集合類之一,其內(nèi)部實(shí)現(xiàn)使用了可重入鎖。該類提供的線程安全操作包括添加、刪除、修改等,以及遍歷集合元素等操作,適用于讀多寫少的場景。
* ObjectMapper:
* Jackson庫中提供的一個用于將對象序列化為JSON格式的類。在這里用于將List對象序列化為JSON字符串。
* List: Java集合框架中提供的一個接口,用于表示有序、可重復(fù)的元素序列。在這里用于保存WebSocket連接會話信息。
* TextMessage: 表示文本類型的WebSocket消息,包括消息內(nèi)容和消息頭部信息等。
*/
2?python
2.1 pip
pip install websocket
pip install websocket-client
2.2 代碼
import websocket
import threading
import json
import time
def on_message(ws, message):
data_list = json.loads(message)
print('Received DateTime: ', data_list[0])
def on_error(ws, error):
print(error)
def on_close(ws):
print('WebSocket closed')
def on_open(ws):
def run(*args):
while True:
time.sleep(10)
ws.send('ping')
ws.close()
print('Thread terminating...')
threading.Thread(target=run).start()
if __name__ == '__main__':
websocket.enableTrace(True)
ws = websocket.WebSocketApp('ws://localhost:8080/websocket',
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever()
'''
上述代碼中確實(shí)沒有打印 ++Rcv raw 和 ++Rcv decoded 的語句。這是因?yàn)樵诖a中使用了 websocket.enableTrace(True),啟用了 WebSocket 的跟蹤模式,會在控制臺打印出 WebSocket 的詳細(xì)信息,包括收發(fā)的字節(jié)流等信息。因此打印 ++Rcv raw 和 ++Rcv decoded 的語句是由 WebSocket 庫自動生成的,不是代碼中明確調(diào)用的。
如果您想禁用這些跟蹤信息,只需要將 websocket.enableTrace(True) 改為 websocket.enableTrace(False) 即可。
'''
文章來源地址http://www.zghlxwxcb.cn/news/detail-625083.html
文章來源:http://www.zghlxwxcb.cn/news/detail-625083.html
到了這里,關(guān)于springboot后端用WebSocket每秒向前端傳遞數(shù)據(jù),python接收數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!