1 springboot
1.1 加依赖
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> </dependency>
1.2 WebSocketConfig 后端设置前端请求的网址,注册请求的信息
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 数据处理与推送
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(); //
每秒调用这个方法处理数据 } 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: *
当WebSocket客户端连接到服务端时会触发这个方法,我们将客户端的WebSocketSession对象添加到sessions列表中。 *
handleTextMessage: 当WebSocket客户端发送消息给服务端时会触发这个方法,在这个示例中,我们暂时不需要处理这个消息。 *
afterConnectionClosed: *
当WebSocket客户端关闭连接时会触发这个方法,我们需要将客户端的WebSocketSession对象从sessions列表中移除。 *
pushDateTimeToClients: 这个方法用于向所有连接到WebSocket服务端的客户端推送当前的日期时间信息。 */ /** *
@Component: 该注解用于将WebSocketHandler类声明为Bean,使其能够被Spring容器管理,需要进行依赖注入时直接注入该类即可。 *
TextWebSocketHandler: *
这是Spring框架提供的一个实现了WebSocketHandler接口的抽象类,用于处理文本类型的WebSocket消息。在实现WebSocketHandler接口时,一般继承该类并重写其中的方法。
* WebSocketSession: *
该类表示WebSocket连接的会话信息,包括连接ID、协议版本、URI等信息,可以通过该类实现向客户端发送消息等功能,也可以获取客户端发送的消息等操作。 *
CopyOnWriteArrayList: *
该类是Java并发包中提供的线程安全集合类之一,其内部实现使用了可重入锁。该类提供的线程安全操作包括添加、删除、修改等,以及遍历集合元素等操作,适用于读多写少的场景。
* ObjectMapper: * Jackson库中提供的一个用于将对象序列化为JSON格式的类。在这里用于将List对象序列化为JSON字符串。 *
List: Java集合框架中提供的一个接口,用于表示有序、可重复的元素序列。在这里用于保存WebSocket连接会话信息。 * TextMessage:
表示文本类型的WebSocket消息,包括消息内容和消息头部信息等。 */
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() '''
上述代码中确实没有打印 ++Rcv raw 和 ++Rcv decoded 的语句。这是因为在代码中使用了
websocket.enableTrace(True),启用了 WebSocket 的跟踪模式,会在控制台打印出 WebSocket
的详细信息,包括收发的字节流等信息。因此打印 ++Rcv raw 和 ++Rcv decoded 的语句是由 WebSocket
库自动生成的,不是代码中明确调用的。 如果您想禁用这些跟踪信息,只需要将 websocket.enableTrace(True) 改为
websocket.enableTrace(False) 即可。 '''