test.rs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. use exchanges::gate_swap_rest::GateSwapRest;
  2. use std::collections::BTreeMap;
  3. use tokio::io::{AsyncReadExt};
  4. use exchanges::kucoin_swap_rest::KucoinSwapRest;
  5. use exchanges::kucoin_swap_ws::{KucoinSubscribeType, KucoinSwapWs, KucoinWsType};
  6. use exchanges::{proxy};
  7. use exchanges::okx_swap_ws::{OkxSubscribeType, OkxSwapWs, OkxWsType};
  8. use std::io::{Read, Write};
  9. use std::sync::Arc;
  10. use std::sync::atomic::AtomicBool;
  11. use tokio::sync::mpsc::channel;
  12. use tokio::try_join;
  13. use tracing::{trace};
  14. use tracing::instrument::WithSubscriber;
  15. use tungstenite::{connect, Message};
  16. use exchanges::binance_swap_rest::BinanceSwapRest;
  17. use exchanges::binance_swap_ws::{BinanceSubscribeType, BinanceSwapWs, BinanceWsType};
  18. use exchanges::okx_swap_rest::OkxSwapRest;
  19. #[tokio::test]
  20. async fn test_import() {
  21. global::log_utils::init_log_with_trace();
  22. /*******走代理:根据环境变量配置来决定,如果配置了走代理,没有配置不走*******/
  23. if proxy::ParsingDetail::http_enable_proxy() {
  24. trace!("检测有代理配置,配置走代理");
  25. }
  26. //获取代理
  27. // demo_get_http_proxy();
  28. //币安---深度socket-公共频道订阅
  29. // demo_pub_ws_ba().await;
  30. // 币安-rest-获取账户信息
  31. // demo_rest_ba().await;
  32. //本次更新成功
  33. //gate-rest -账户信息
  34. // demo_rest_gate().await;
  35. //gate-ws-public-private频道
  36. // demo_ws_gate().await;
  37. //kucoin_rest -账户信息
  38. demo_rest_kucoin().await;
  39. //Kucoin-ws--公共频道
  40. // demo_ws_kucoin_pu().await;
  41. //Kucoin-ws--私有频道
  42. // demo_ws_kucoin_pr().await;
  43. //okx - Business 频道
  44. // demo_ws_okx_bu().await;
  45. //okx - public 频道
  46. // demo_ws_okx_pu().await;
  47. //okx - rest 频道
  48. // demo_okx_rest().await;
  49. // demo_so();
  50. // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
  51. // KucoinWsType::Private, tx).await;
  52. // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
  53. //
  54. // let t1 = tokio::spawn(async move {
  55. // ku_ws.custom_subscribe(vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
  56. // });
  57. //
  58. // let t2 = tokio::spawn(async move {
  59. // let mut stdout = std::io::stdout();
  60. // loop {
  61. // if let Ok(received) = rx.try_recv() {
  62. // writeln!(stdout, "age: {:?}", received).unwrap();
  63. // }
  64. // }
  65. // let t01 = tokio::spawn(async move {
  66. // loop {
  67. // tokio::time::sleep(Duration::from_secs(2)).await;
  68. // trace!( "发送-指令: ");
  69. // }
  70. // });
  71. // let t02 = tokio::spawn(async move {
  72. // loop {
  73. // tokio::time::sleep(Duration::from_secs(3)).await;
  74. // trace!( "接收 -指令: ");
  75. // }
  76. // });
  77. // try_join!(t01,t02).unwrap();
  78. // let (mut tx_end, mut rx_end) = channel::<String>(1024);
  79. // let (mut tx_read, mut rx_read) = channel::<String>(1024);
  80. // let mut stream = tokio::net::TcpStream::connect("127.0.0.1:8080").await.unwrap();
  81. // stream.write_all( b"Hello, server!").await.unwrap();
  82. // stream.flush().await.unwrap();
  83. // let mutex_stream = Arc::new(Mutex::new(stream));
  84. //
  85. // //捕捉用户的主动发送的订阅指令
  86. // let stream_clone = Arc::clone(&mutex_stream);
  87. // let t_1 = tokio::spawn(async move {
  88. // loop {
  89. // tokio::time::sleep(Duration::from_secs(1)).await;
  90. // if let Ok(received) = rx_end.try_recv() {
  91. // trace!("动态订阅内容: {:?}", received);
  92. // let mut stream_lock = stream_clone.lock().await;
  93. // // stream_lock.write_all( b"1111!").await.unwrap();
  94. // // stream_lock.flush().await.unwrap();
  95. //
  96. // // stream_lock.write_all(b"Hello, server!").await.unwrap();
  97. // }
  98. // }
  99. // });
  100. //
  101. //
  102. // //socket数据获取,装入回显通道
  103. // let stream_clone = Arc::clone(&mutex_stream);
  104. // let t_2 = tokio::spawn(async move {
  105. // // 创建一个用于存储服务器响应的缓冲区
  106. // let mut buffer = [0; 512];
  107. // loop {
  108. // let mut stream_lock = stream_clone.lock().await;
  109. // tokio::time::sleep(Duration::from_secs(1)).await;
  110. //
  111. // let _ = match stream_lock.read(&mut buffer).await {
  112. // Ok(n) => {
  113. // tokio::time::sleep(Duration::from_secs(1)).await;
  114. // if n == 0 {
  115. // // 没有读取到数据
  116. // trace!("没有数据,主动发送");
  117. // } else {
  118. // // 打印服务器的响应
  119. // trace!("有数据: {}", String::from_utf8_lossy(&buffer[..n]));
  120. // tx_read.send(format!("{}", String::from_utf8_lossy(&buffer[..n]))).await.unwrap()
  121. // }
  122. // }
  123. // Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
  124. // // 如果读取操作会阻塞,则等待一会儿再试
  125. // trace!("Would block, sleeping会阻碍睡眠??");
  126. // tokio::time::sleep(Duration::from_secs(3)).await;
  127. // continue;
  128. // }
  129. // Err(e) => {
  130. // trace!("Err:{:?}",e);
  131. // break;
  132. // }
  133. // };
  134. // }
  135. // });
  136. //
  137. //
  138. // //socket 数据回显
  139. // let t02 = tokio::spawn(async move {
  140. // loop {
  141. // tokio::time::sleep(Duration::from_secs(1)).await;
  142. // // tx.send("hai!!!".to_string()).await.unwrap();
  143. // if let Ok(received) = rx_read.try_recv() {
  144. // trace!("拿到 socket 的数据: {:?}", received);
  145. // }
  146. // }
  147. // });
  148. //
  149. // //模拟用户动态发送
  150. // let t03 = tokio::spawn(async move {
  151. // loop {
  152. // tokio::time::sleep(Duration::from_secs(1)).await;
  153. // tx_end.send("这里是 动态订阅".to_string()).await.unwrap();
  154. // }
  155. // });
  156. //
  157. // try_join!(t_1,t_2,t02,t03).unwrap();
  158. }
  159. async fn demo_okx_rest() {
  160. // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  161. // btree_map.insert("access_key".to_string(), "".to_string());
  162. // btree_map.insert("secret_key".to_string(), "".to_string());
  163. // btree_map.insert("pass_key".to_string(), "".to_string());
  164. //
  165. // let mut okx_rest = OkxSwapRest::new(false, btree_map);
  166. // let res_data = okx_rest.get_account("BTC".to_string()).await;
  167. // trace!("okx_rest-rest - get_account- {:?}", res_data);
  168. }
  169. async fn demo_ws_gate() {
  170. }
  171. fn demo_so() {
  172. // 代理服务器地址和端口
  173. // let proxy_address = "127.0.0.1:7890";
  174. // // 目标服务器地址和端口
  175. // let target_address = "wss://ws.okx.com:8443/ws/v5/public";
  176. //
  177. // // 建立与代理服务器的连接
  178. // let mut proxy_stream = TcpStream::connect(proxy_address).expect("Failed to connect to proxy");
  179. //
  180. // // 发送代理请求
  181. // let request = format!("CONNECT {}\r\n\r\n", target_address);
  182. // proxy_stream.write_all(request.as_bytes()).expect("Failed to send proxy request");
  183. //
  184. // // 读取代理响应
  185. // let mut response = String::new();
  186. // proxy_stream.read_to_string(&mut response).expect("Failed to read proxy response");
  187. //
  188. // // 检查代理响应是否成功
  189. // if !response.contains("200 Connection established") {
  190. // trace!("Proxy connection failed: {}", response);
  191. // }
  192. //
  193. // // 从代理连接中获取原始 TCP 流
  194. // let mut tcp_stream = std::mem::ManuallyDrop::new(proxy_stream);
  195. //
  196. // // 现在你可以使用 `tcp_stream` 来进行与目标服务器的通信
  197. // // 例如,发送和接收数据
  198. // // tcp_stream.write_all(b"Hello, server!").expect("Failed to send data");
  199. //
  200. // thread::spawn(move || {
  201. // loop {
  202. // let mut buffer = [0u8; 1024]; // 用于存储读取的数据的缓冲区
  203. // let bytes_read = tcp_stream.read(&mut buffer).expect("Failed to read data");
  204. //
  205. // // 将读取的数据转换为字符串并打印
  206. // if let Ok(data) = std::str::from_utf8(&buffer[..bytes_read]) {
  207. // trace!("Received data: {}", data);
  208. // } else {
  209. // trace!("Received data contains non-UTF8 characters");
  210. // }
  211. // }
  212. //
  213. // });
  214. //
  215. // // 最后记得手动释放套接字
  216. // // 注意:不要调用 `drop(tcp_stream)`,因为我们使用了 `ManuallyDrop` 来避免自动释放
  217. // unsafe {
  218. // std::mem::ManuallyDrop::drop(&mut tcp_stream);
  219. // }
  220. }
  221. async fn demo_ws_okx_pu() {
  222. // let btree_map: BTreeMap<String, String> = BTreeMap::new();
  223. // let (tx, mut rx) = channel(1024);
  224. // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Public, tx);
  225. // ku_ws.set_subscribe(vec![OkxSubscribeType::PuIndexTickers]);
  226. // let t1 = tokio::spawn(async move {
  227. // ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
  228. // });
  229. // let t2 = tokio::spawn(async move {
  230. // let mut stdout = std::io::stdout();
  231. // loop {
  232. // if let Ok(received) = rx.try_recv() {
  233. // writeln!(stdout, "age: {:?}", received).unwrap();
  234. // }
  235. // }
  236. // });
  237. // try_join!(t1,t2).unwrap();
  238. }
  239. async fn demo_ws_okx_bu() {
  240. // let btree_map: BTreeMap<String, String> = BTreeMap::new();
  241. // let (tx, mut rx) = channel(1024);
  242. // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Business, tx);
  243. // ku_ws.set_subscribe(vec![OkxSubscribeType::BuIndexCandle30m]);
  244. // let t1 = tokio::spawn(async move {
  245. // ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
  246. // });
  247. // let t2 = tokio::spawn(async move {
  248. // let mut stdout = std::io::stdout();
  249. // loop {
  250. // if let Ok(received) = rx.try_recv() {
  251. // writeln!(stdout, "age: {:?}", received).unwrap();
  252. // }
  253. // }
  254. // });
  255. // try_join!(t1,t2).unwrap();
  256. }
  257. async fn demo_ws_kucoin_pr() {
  258. let mut bool_v1 = Arc::new(AtomicBool::new(true));
  259. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  260. btree_map.insert("access_key".to_string(), "".to_string());
  261. btree_map.insert("secret_key".to_string(), "".to_string());
  262. btree_map.insert("pass_key".to_string(), "".to_string());
  263. trace!("----------------------btree_map{:?}", btree_map.clone());
  264. let (tx, mut rx) = channel(1024);
  265. let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
  266. KucoinWsType::Private, tx).await;
  267. ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
  268. let t1 = tokio::spawn(async move {
  269. ku_ws.custom_subscribe(bool_v1,vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
  270. });
  271. let t2 = tokio::spawn(async move {
  272. loop {
  273. if let Ok(received) = rx.try_recv() {
  274. trace!( "age: {:?}", received);
  275. }
  276. }
  277. });
  278. try_join!(t1,t2).unwrap();
  279. }
  280. async fn demo_ws_kucoin_pu() {
  281. let mut bool_v1 = Arc::new(AtomicBool::new(true));
  282. let btree_map: BTreeMap<String, String> = BTreeMap::new();
  283. let (tx, mut rx) = channel(1024);
  284. let mut ku_ws = KucoinSwapWs::new(false, btree_map, KucoinWsType::Public, tx).await;
  285. ku_ws.set_subscribe(vec![
  286. KucoinSubscribeType::PuContractMarketLevel2Depth50,
  287. KucoinSubscribeType::PuContractMarkettickerV2,
  288. ]);
  289. let t1 = tokio::spawn(async move {
  290. ku_ws.custom_subscribe(bool_v1,vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
  291. });
  292. let t2 = tokio::spawn(async move {
  293. loop {
  294. if let Ok(received) = rx.try_recv() {
  295. trace!("age: {:?}", received);
  296. }
  297. }
  298. });
  299. try_join!(t1,t2).unwrap();
  300. }
  301. async fn demo_rest_kucoin() {
  302. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  303. btree_map.insert("access_key".to_string(), "".to_string());
  304. btree_map.insert("secret_key".to_string(), "".to_string());
  305. btree_map.insert("pass_key".to_string(), "".to_string());
  306. let mut kucoin_exc = KucoinSwapRest::new(false, btree_map);
  307. // let res_data = kucoin_exc.get_server_time().await;
  308. // trace!("kucoin_exc-rest - get_server_time- {:?}", res_data);
  309. // trace!("kucoin_exc-rest-get_delays{:?}", kucoin_exc.get_delays() );
  310. // trace!("kucoin_exc-rest -get_avg_delay{:?}", kucoin_exc.get_avg_delay());
  311. // let res_data = kucoin_exc.get_account("USDT".to_string()).await;
  312. // trace!("kucoin_exc-rest - get_account- {:?}", res_data);
  313. // let res_data = kucoin_exc.get_position("XBT1USDM".to_string()).await;
  314. // trace!("kucoin_exc-rest - get_position- {:?}", res_data);
  315. // let res_data = kucoin_exc.get_market_details().await;
  316. // trace!("kucoin_exc-rest - get_market_details- {:?}", res_data);
  317. // let res_data = kucoin_exc.get_ticker("ROSEUSDTM".to_string()).await;
  318. // trace!("kucoin_exc-rest - get_ticker- {:?}", res_data);
  319. let res_data = kucoin_exc.get_orders("".to_string(),
  320. "".to_string()).await;
  321. trace!("kucoin_exc-rest - get_orders- {:?}", res_data);
  322. // let res_data = kucoin_exc.get_positions("USDT".to_string()).await;
  323. // trace!("kucoin_exc-rest - get_positions- {:?}", res_data);
  324. // let res_data = kucoin_exc.get_orders_details("111".to_string(), "".to_string()).await;
  325. // trace!("kucoin_exc-rest - get_orders_details- {:?}", res_data);
  326. // let res_data = kucoin_exc.swap_bazaar_order(
  327. // "cs_202309111808".to_string(),
  328. // "ROSEUSDTM".to_string(),
  329. // "pd".to_string(),
  330. // 1,
  331. // "10".to_string(),
  332. // "0.03856".to_string(),
  333. // "limit".to_string(),
  334. // ).await;
  335. // trace!("kucoin_exc-rest - swap_bazaar_order- {:?}
  336. // let res_data = kucoin_exc.cancel_order("".to_string(), "999999".to_string()).await;
  337. // trace!("kucoin_exc-rest - cancel_order- {:?}", res_data);
  338. // let res_data = kucoin_exc.get_public_token().await;
  339. // trace!("kucoin_exc-rest - get_public_token- {:?}", res_data);
  340. }
  341. async fn demo_rest_gate() {
  342. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  343. btree_map.insert("access_key".to_string(), "".to_string());
  344. btree_map.insert("secret_key".to_string(), "".to_string());
  345. let mut gate_exc = GateSwapRest::new(false, btree_map);
  346. let res_data = gate_exc.get_account("usdt".to_string()).await;
  347. trace!("gate-rest -账户信息{:?}", res_data);
  348. trace!("gate-rest -get_delays{:?}", gate_exc.get_delays() );
  349. trace!("gate-rest -get_avg_delay{:?}", gate_exc.get_avg_delay());
  350. // let res_data = gate_exc.get_position("usdt".to_string(), "CYBER_USDT".to_string()).await;
  351. // trace!("gate-rest -持仓信息{:?}", res_data);
  352. // let res_data = gate_exc.get_ticker("usdt".to_string()).await;
  353. // trace!("gate-rest -ticker{:?}", res_data);
  354. // let res_data = gate_exc.get_server_time().await;
  355. // trace!("gate-rest -get_server_time{:?}", res_data);
  356. // let res_data = gate_exc.get_user_position("usdt".to_string()).await;
  357. // trace!("gate-rest -get_server_time{:?}", res_data);
  358. // let res_data = gate_exc.get_order_details("usdt".to_string(), "11335522".to_string()).await;
  359. // trace!("gate-rest -get_order_details{:?}", res_data);
  360. // let res_data = gate_exc.get_orders("usd1t".to_string(), "open".to_string()).await;
  361. // trace!("gate-rest -get_orders{:?}", res_data);
  362. // let params = serde_json::json!({
  363. // "contract":"CYBER_USDT",
  364. // "size":-1,
  365. // "price":"0",
  366. // "tif":"ioc",
  367. // });
  368. // let res_data = gate_exc.take_order("usdt".to_string(), params).await;
  369. // trace!("gate-rest -get_orders{:?}", res_data);
  370. // let res_data = gate_exc.setting_dual_mode("usdt".to_string(), true).await;
  371. // trace!("gate-rest -setting_dual_mode{:?}", res_data);
  372. // let res_data = gate_exc.setting_dual_leverage("usdt".to_string(),
  373. // "CYBER_USDT".to_string(),
  374. // "20".to_string(),
  375. // ).await;
  376. // trace!("gate-rest -setting_dual_mode{:?}", res_data);
  377. // let res_data = gate_exc.wallet_transfers("usdt".to_string(),
  378. // "CYBER_USDT".to_string(),
  379. // "20".to_string(),
  380. // ).await;
  381. // trace!("gate-rest -setting_dual_mode{:?}", res_data);
  382. // let res_data = gate_exc.cancel_order("usdt".to_string(),
  383. // "12345".to_string(),
  384. // ).await;
  385. // trace!("gate-rest -setting_dual_mode{:?}", res_data);
  386. // let res_data = gate_exc.cancel_orders("usdt".to_string(),
  387. // "CYBER_USDT".to_string(),
  388. // ).await;
  389. // trace!("gate-rest -cancel_orders{:?}", res_data);
  390. // let res_data = gate_exc.order(
  391. // "usdt".to_string(),
  392. // "long".to_string(),
  393. // "buy".to_string(),
  394. // "ROSE_USDT".to_string(),
  395. // 1,
  396. // "0.03888".to_string(),
  397. // "t-my-custom-id-001".to_string(),
  398. // ).await;
  399. // trace!("gate-rest -order{:?}", res_data);
  400. let res_data = gate_exc.my_trades("usdt".to_string()).await;
  401. trace!("gate-rest -my_trades{:?}", res_data);
  402. let res_data = gate_exc.account_book("usdt".to_string()).await;
  403. trace!("gate-rest -account_book{:?}", res_data);
  404. }
  405. async fn demo_rest_ba() {
  406. let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
  407. btree_map.insert("access_key".to_string(), "".to_string());
  408. btree_map.insert("secret_key".to_string(), "".to_string());
  409. // let ba_exc = BinanceUsdtSwapRest::new(false, btree_map);
  410. // let res_data = ba_exc.get_account().await;
  411. let mut ba_exc = BinanceSwapRest::new(false, btree_map);
  412. // let res_data = ba_exc.get_server_time().await;
  413. // trace!("币安-rest - get_server_time{:?}", res_data);
  414. // let res_data = ba_exc.get_exchange_info().await;
  415. // trace!("币安-restget_ get_exchange_info{:?}", res_data);
  416. let res_data = ba_exc.get_account().await;
  417. trace!("币安-rest-获取账户信息{:?}", res_data);
  418. // trace!("币安-rest- -get_delays{:?}", ba_exc.get_delays() );
  419. // trace!("币安-rest--get_avg_delay{:?}", ba_exc.get_avg_delay());
  420. // let res_data = ba_exc.get_order("BTCUSDT".to_string(), 131, "".to_string()).await;
  421. // trace!("币安-rest--get_order{:?}", res_data);
  422. // let res_data = ba_exc.get_open_orders("BTCUSDT".to_string()).await;
  423. // trace!("币安-rest--get_open_orders{:?}", res_data);
  424. // let timestamp_start = chrono::Utc::now().timestamp_millis() - 60 * 100 * 1000;
  425. // let timestamp_end = chrono::Utc::now().timestamp_millis() + 60 * 100 * 1000;
  426. // let res_data = ba_exc.get_all_orders("BTCUSDT".to_string(), 1000, timestamp_start, timestamp_end).await;
  427. // trace!("币安-rest--get_all_orders{:?}", res_data);
  428. // let res_data = ba_exc.get_book_ticker("BTCUSDT".to_string()).await;
  429. // trace!("币安-rest--get_book_ticker{:?}", res_data);
  430. // let res_data = ba_exc.get_position_risk("BTCUS1DT".to_string()).await;
  431. // trace!("币安-rest--get_position_risk{:?}", res_data);
  432. // let res_data = ba_exc.change_pos_side(true).await;
  433. // trace!("币安-rest--change_pos_side{:?}", res_data);
  434. // let res_data = ba_exc.cancel_order("BTCUSDT".to_string(), 3312331, "".to_string()).await;
  435. // trace!("币安-rest--cancel_order{:?}", res_data);
  436. }
  437. async fn demo_pub_ws_ba() {
  438. // let mut bool_v1 = Arc::new(AtomicBool::new(true));
  439. // let btree_map: BTreeMap<String, String> = BTreeMap::new();
  440. // let (tx, mut rx) = channel(1024);
  441. // let mut binance_ws = BinanceSwapWs::new(false, btree_map, BinanceWsType::PublicAndPrivate, tx);
  442. // binance_ws.set_subscribe(vec![
  443. // BinanceSubscribeType::PuAggTrade,
  444. // BinanceSubscribeType::PuDepth20levels100ms,
  445. // BinanceSubscribeType::PuBookTicker,
  446. // ]);
  447. // let t1 = tokio::spawn(async move {
  448. // binance_ws.custom_subscribe(bool_v1,vec!["BTCUSDT".to_string()]).await;
  449. // });
  450. // let t2 = tokio::spawn(async move {
  451. // loop {
  452. // if let Ok(received) = rx.try_recv() {
  453. // trace!( "age: {:?}", received);
  454. // }
  455. // }
  456. // });
  457. // try_join!(t1,t2).unwrap();
  458. }
  459. fn demo_get_http_proxy() {
  460. //代理地址
  461. let parsing_detail = proxy::ParsingDetail::parsing_environment_variables();
  462. trace!("----代理信息:{:?}", parsing_detail);
  463. }
  464. // /*********************web服务*/
  465. // fn demo_http() {
  466. // let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
  467. // for stream in listener.incoming() {
  468. // let stream = stream.unwrap();
  469. //
  470. // handle_connection(TcpStream::try_from(stream).unwrap());
  471. // }
  472. // }
  473. //
  474. //
  475. // fn handle_connection(mut stream: TcpStream) {
  476. // let buf_reader = BufReader::new(&mut stream);
  477. // let http_request: Vec<_> = buf_reader
  478. // .lines()
  479. // .map(|result| result.unwrap())
  480. // .take_while(|line| !line.is_empty())
  481. // .collect();
  482. // trace!("Request: {:#?}", http_request);
  483. // trace!("Request2: {:#?}", http_request[0]);
  484. // trace!("Request3: {:#?}", http_request[1]);
  485. //
  486. // let (status_line, filename) = if http_request[0] == "GET / HTTP/1.1" {
  487. // ("HTTP/1.1 200 OK", "hello.html")
  488. // } else {
  489. // ("HTTP/1.1 404 NOT FOUND", "404.html")
  490. // };
  491. //
  492. // let status_line = "HTTP/1.1 200 OK";
  493. // let contents = fs::read_to_string("src/404.html").unwrap();
  494. // let length = contents.len();
  495. //
  496. // let response =
  497. // format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
  498. // // let response = "HTTP/1.1 200 OK\r\n\r\nccccc";
  499. //
  500. // stream.write_all(response.as_bytes()).unwrap();
  501. // }