Websocket實時行情接口 (2025最新使用教程)

本教程將指導您如何使用Java Websocket客戶端連接實時行情接口,并訂閱相關數據。

步驟1:配置您的項目

確保您的項目已引入以下依賴:

  • jakarta.websocket-api
  • jakarta.websocket-client-api
  • fastjson2
  • lombok
  • spring-context (如果使用Spring框架)

步驟2:創建Websocket客戶端

創建一個Java類,例如 WebsocketExample,并添加 @ClientEndpoint@Component 注解。

package org.example.ws;import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.PostConstruct;
import jakarta.websocket.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URI;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;// 注冊獲取API KEY: www.infoway.io
// 官方對接文檔:docs.infoway.io@ClientEndpoint
@Slf4j
@Component
public class WebsocketExample {// 本地session通道private static Session session;// wss連接地址 business可以為stock、crypto、common;apikey為您的憑證// 申請API KEY: www.infoway.ioprivate static final String WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey";@PostConstructpublic void connectAll() {try {// 建立WEBSOCKET連接connect(WS_URL);// 開啟自動重連startReconnection(WS_URL);} catch (Exception e) {log.error("Failed to connect to " + WS_URL + ": " + e.getMessage());}}// 自動重連機制,會開啟一個定時線程判斷連接是否斷開,斷開自動重連private void startReconnection(String s) {ScheduledExecutorService usExecutor = Executors.newScheduledThreadPool(1);Runnable usTask = () -> {if (session == null || !session.isOpen()) {log.debug("reconnection...");connect(s);}};usExecutor.scheduleAtFixedRate(usTask, 1000, 10000, TimeUnit.MILLISECONDS);}// 建立WEBSOCKET連接具體實現private void connect(String s) {try {WebSocketContainer container = ContainerProvider.getWebSocketContainer();session = container.connectToServer(WebsocketExample.class, URI.create(s));} catch (DeploymentException | IOException e) {log.error("Failed to connect to the server: {}", e.getMessage());}}// WEBSOCKET連接建立成功后會執行下面的方法@OnOpenpublic void onOpen(Session session) throws IOException, InterruptedException {System.out.println("Connection opened: " + session.getId());// 訂閱實時成交明細 (代碼 10000)subscribeToData(session, 10000, "BTCUSDT", "trade_trace");// 訂閱實時盤口數據 (代碼 10003)Thread.sleep(5000); // 間隔一段時間subscribeToData(session, 10003, "BTCUSDT", "depth_trace");// 訂閱實時K線數據 (代碼 10006, 1分鐘K線)Thread.sleep(5000); // 間隔一段時間subscribeKlineData(session, "BTCUSDT", 1, "kline_trace");// 定時發送心跳 (30)ScheduledExecutorService pingExecutor = Executors.newScheduledThreadPool(1);Runnable pingTask = WebsocketExample::ping;pingExecutor.scheduleAtFixedRate(pingTask, 30, 30, TimeUnit.SECONDS);}// 封裝訂閱數據請求private void subscribeToData(Session session, int code, String symbol, String trace) throws IOException {JSONObject sendObj = new JSONObject();sendObj.put("code", code);sendObj.put("trace", trace);JSONObject data = new JSONObject();data.put("codes", symbol);sendObj.put("data", data);session.getBasicRemote().sendText(sendObj.toJSONString());}// 封裝訂閱K線數據請求private void subscribeKlineData(Session session, String symbol, int klineType, String trace) throws IOException {JSONObject klineSendObj = new JSONObject();klineSendObj.put("code", 10006);klineSendObj.put("trace", trace);JSONObject klineData = new JSONObject();JSONArray klineDataArray = new JSONArray();JSONObject klineObj = new JSONObject();klineObj.put("type", klineType);klineObj.put("codes", symbol);klineDataArray.add(klineObj);klineData.put("arr", klineDataArray);klineSendObj.put("data", klineData);session.getBasicRemote().sendText(klineSendObj.toJSONString());}@OnMessagepublic void onMessage(String message, Session session) {// 處理接收到的消息,包含訂閱成功/失敗提示和行情數據System.out.println("Message received: " + message);}@OnClosepublic void onClose(Session session, CloseReason reason) {System.out.println("Connection closed: " + session.getId() + ", reason: " + reason);}@OnErrorpublic void onError(Throwable error) {error.printStackTrace();}// 發送心跳請求public static void ping() {try {JSONObject jsonObject = new JSONObject();jsonObject.put("code", 10010);jsonObject.put("trace", "heartbeat_trace");session.getBasicRemote().sendText(jsonObject.toJSONString());} catch (IOException e) {throw new RuntimeException("Failed to send heartbeat: " + e.getMessage(), e);}}
}

步驟3:理解核心方法

WS_URL: 這是WebSocket連接地址,您需要替換 yourApikey 為您的實際憑證。

business 參數指定業務類型:stock (股票), crypto (加密貨幣), common (通用)。

@PostConstruct connectAll(): Spring Boot應用啟動時會自動調用此方法,用于建立WebSocket連接和啟動自動重連機制。

startReconnection(String s): 實現自動重連的邏輯,每隔10秒檢查連接狀態,如果斷開則嘗試重新連接。

connect(String s): 建立WebSocket連接的具體實現。

@OnOpen onOpen(Session session): 連接成功建立后,此方法會被調用。您可以在這里發送訂閱請求。

訂閱請求: 通過構建JSON對象發送訂閱請求。code 字段是請求協議號,data 字段包含訂閱的具體內容(例如:交易對、K線類型)。

實時成交明細: code10000

實時盤口數據: code10003

實時K線數據: code10006type 字段指定K線類型(例如:1代表1分鐘K線)。

心跳機制: ping() 方法會定時發送心跳請求 (code: 10010),防止長時間不活躍導致連接斷開。

@OnMessage onMessage(String message, Session session): 當接收到服務端推送的消息時,此方法會被調用。您可以在這里解析并處理行情數據。

@OnClose onClose(Session session, CloseReason reason): 連接關閉時調用。

@OnError onError(Throwable error): 連接發生錯誤時調用。

步驟4:運行您的應用

如果您使用的是Spring Boot,直接運行您的主應用類即可。WebSocket客戶端會自動啟動并嘗試連接。

注意事項:

  • API文檔: 詳細的 code 列表和 data 格式請參考Infoway的WebSocket API文檔:https://docs.infoway.io/websocket-api/endpoints
  • 錯誤處理: 生產環境中,您應該對連接、發送和接收消息中的異常進行更詳細的捕獲和處理。
  • 自定義Trace: trace 字段是自定義標識,可用于追蹤請求響應。

通過以上步驟,您就能成功連接實時行情接口并開始接收數據了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91228.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JEECG】JVxeTable表格拖拽排序功能

功能說明: 實現JVxeTable表格拖拽排序功能 解決子表拖拽排序后,點擊保存數據,未實現拖拽排序后效果 參數配置: 提示: 1.開啟 dragSort 屬性之后即可實現上下拖拽排序。 2.使用 sortKey 屬性可以自定義排序保存的 key&…

【騰訊云】EdgeOne網站安全防護的配置方法 防范盜刷流量 附惡意IP和UA黑名單

經過上個月的前車之鑒,我摸索出一套針對騰訊云EdgeOne《付費版》的安全配置模板,僅供各位站長參考 配置方法 一、在EdgeOne控制面板頁面,點擊要配置的域名。 二、進入后,點擊安全防護-WEB防護-自定義規則,按圖所示添加…

白玩 一 記錄retrofit+okhttp+flow 及 kts的全局配置

先回憶下flow吧! flow是啥 Flow 是 Kotlin 協程框架中的一個異步數據流處理組件,專為響應式編程設計,適用于需要連續或異步返回多個值的場景,如網絡請求、數據庫查詢、傳感器數據等 1 ?異步流(Asynchronous Stream…

犯罪現場三維還原:科技助力刑偵變革

在刑偵領域,犯罪現場的準確還原對于案件偵破起著至關重要的作用。傳統的現場記錄方式,如拍照、繪圖等,雖然能獲取一定信息,但難以全面、直觀地呈現現場全貌,容易遺漏關鍵細節,且在后期分析和信息傳達上存在…

go-admin 構建arm鏡像

目錄 1、 go-admin Dockerfile 2、docker build go-admin 3、settings.yml 4、go-admin-ui Dockerfile 5、docker build go-admin-ui 6、go-admin.yaml 7、go-admin-ui.yaml 1、 go-admin Dockerfile # 構建階段:使用 Go 1.24 版本(支持遠程調試) FROM golang:1.24-…

深入淺出:C++ STL簡介與學習指南

目錄 前言 STL的版本演變 STL六大組件 STL的重要性 如何學習STL STL的缺陷 總結 前言 什么是STL? STL(Standard Template Library,標準模板庫)是C標準庫的核心組成部分,它不僅是一個可復用的組件庫,更是一…

Mysql事務原理

臟讀(Dirty Read) 某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個進行了RollBack,則后一個事務所讀取的數據就會是不正確的。 不可重復讀(Non-repeatable read) 在一個事務的兩次查詢之中數據不一…

小紅書筆記詳情API指南

一、引言小紅書作為中國領先的社交電商平臺,擁有超過4.8億用戶(2025年Q2數據),其開放平臺已成為品牌營銷與數據挖掘的重要渠道?1。通過筆記詳情API獲取數據,可以幫助商家、品牌方和數據分析人員了解用戶反饋、市場趨勢和消費需求?。這些數據…

VS+Qt中使用QCustomPlot繪制曲線標簽(附源碼)

在qt中我們常常會使用數據來繪制曲線,常用的的繪制方法用QCutomPlot、QChart和QPrinter。有時我們會根據需要在曲線進行二次繪制,包括對曲線打標簽,顯示某個點的值等功能。本文主要為大家介紹在QCustomPlot中使用QCPItemTracer和QCPItemText繪…

Spring Boot項目生產環境部署完整指南

在Spring Boot應用開發完成后,如何將其穩定、高效地部署到生產環境是每個開發者都需要掌握的關鍵技能。本文將詳細介紹Spring Boot項目的多種部署方案,從傳統部署到現代化容器部署,選擇最適合的部署策略。 1. 部署前的準備工作 1.1 項目打包優…

微信小程序中實現頁面跳轉的方法

微信小程序中頁面跳轉主要有兩種方式:聲明式導航(通過組件實現)和編程式導航(通過API實現)。兩種方式適用于不同場景,以下詳細說明。一、聲明式導航(navigator組件)通過小程序內置的…

從0開始學linux韋東山教程Linux驅動入門實驗班(7)

本人從0開始學習linux,使用的是韋東山的教程,在跟著課程學習的情況下的所遇到的問題的總結,理論雖枯燥但是是基礎。本人將前幾章的內容大致學完之后,考慮到后續驅動方面得更多的開始實操,后續的內容將以韋東山教程Linux驅動入門實…

國內AI IDE競逐:騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼

國內AI IDE競逐:騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼 隨著人工智能技術的不斷發展,各大科技公司紛紛推出自家的AI IDE,推動軟件開發進入全新的智能化時代。騰訊的 CodeBuddy IDE、阿里云的 通義靈碼 AI IDE、字節跳動的…

git rebase使用教程 以及和merge的區別

Merge和Rebase概念概述 rebase 和 merge 相似,但又不完全相同,本質上都是用來合并分支的命令,區別如下 merge合并分支會多出一條merge commit記錄,而rebase不會merge的提交樹是非線性的,會有分叉,而rebase的…

React中的合成事件解釋和理解

什么是合成事件(Synthetic event)?它和原生事件有什么區別?解題思路:解釋合成事件,然后對比原生事件,然后再說他的優勢1.一致性 在 react里面,這個合成事件是非常重要的,因為它就是為了解決瀏覽器之間與事…

【Python系列】使用 memory_profiler 診斷 Flask 應用內存問題

博客目錄一、內存分析的重要性二、memory_profiler 基礎使用安裝與基本配置理解分析報告三、在 Flask 應用中使用 memory_profiler裝飾視圖函數使用 mprof 進行長期監控四、高級內存分析技巧精確測量代碼塊內存定期內存采樣結合 objgraph 分析對象引用五、常見內存問題及解決方…

vue3【組件封裝】超級表單 S-form.vue

最終效果 代碼實現 components/SUI/S-form.vue <script lang"ts" setup> import type { FormInstance } from "element-plus";// 使用索引簽名定義對象類型 type GenericObject {[key: string]: any; };const props defineProps<{Model?: Gen…

Android Studio Memory Monitor內存分析核心指標詳解

Depth、Native Size、Shallow Size、Retained Size 解析 一、指標定義與對比指標定義計算邏輯重要性Shallow Size對象自身實例占用的內存基本類型字段大小 引用指針 內存對齊對象的基礎內存成本Retained Size回收該對象可釋放的總內存量&#xff08;含所有依賴對象&#xff0…

vue中使用wavesurfer.js繪制波形圖和頻譜圖(支持.pcm)

新的實現方式&#xff1a;vue使用Canvas繪制頻譜圖 安裝wavesurfer.js npm install wavesurfer.js第一版&#xff1a; 組件特點&#xff1a; 一次性加載好所有的數據&#xff1b; <template><div class"audio-visualizer-container"><div class&…

go mod教程、go module

什么是go mod go mod 是go語言的包管理工具&#xff0c;類似java 的maven&#xff0c;go mod的出現可以告別goPath&#xff0c;使用go module來管理項目&#xff0c;有了go mod賬號就不需要非得把項目放到gopath/src目錄下了&#xff0c;你可以在磁盤的任何位置新建一個項目 go…