use bitunix::{run};use ws::{connect, CloseCode, Sender};use std::borrow::Borrow;use std::f64::consts;use std::time::{SystemTime, UNIX_EPOCH, Duration};use serde_json;use std::thread;use time;mod websocket;use websocket::sub_channel::SubChannel;use std::rc::Rc;use std::sync::{Mutex, Arc};fn main() { run(); if let Err(error) = connect("ws://zengwe.xyz/ws-futures/?from=contract&compress=0", |out| { let out = Arc::new(Mutex::new(out)); // { // let out = Arc::clone(&out); // thread::spawn(move || loop { // thread::sleep(Duration::from_secs(3)); // print!("send msg!\n"); // if let Err(e) = out.lock().unwrap().send(format!("{{\"ping\": {:?}}}", time::get_time().sec)) { // println!("Error sending a periodic message: {:?}", e); // } // }); // } // thread::sleep(Duration::from_secs(3)); let mark_price_channel = SubChannel::new("mark_price_btcusdt"); let send_msg = serde_json::to_string(&mark_price_channel).unwrap(); print!("{:?}", send_msg); // // out.lock().unwrap().send(send_msg); { let out = Arc::clone(&out); let temp_out = out.lock().unwrap(); temp_out.send(send_msg); } move |msg| { // 处理在此连接上接收的消息 println!("Client 收到消息 '{}'. ", msg); // out.send("'{\"pong\":1705631243}").unwrap(); // 关闭连接 // out.close(CloseCode::Normal); return Ok(()); } }) { // 通知用户故障 println!("Failed to create WebSocket due to: {:?}", error); }}
let out = Arc::clone(&out); let temp_out = out.lock().unwrap(); temp_out.send(send_msg);都会报错(Encountered an error: not connected)
删除这里在前面的线程中是可以循环send消息的
求大佬帮助!
这里不管怎么改调用send
1.在这里Arc::clone试过不行
2.sleep一会儿还是不行
刚开始学,rust有点难,还没入门提的问题可能有点弱鸡,望各位大佬能提点一下
根据你提供的代码,问题可能出在多个地方。首先,让我们先理解一下你的代码的逻辑。
在代码中,你创建了一个WebSocket连接,并使用Arc
和Mutex
对out
进行了封装,以便在多个线程中共享和修改它。然后,你尝试通过这个WebSocket连接发送消息。
关于你的问题,报错“Encountered an error: not connected”可能是由于以下原因:
Arc
和Mutex
对out
进行了封装,你需要确保在发送消息时对out
的访问是线程安全的。你需要确保每次只有一个线程访问和修改out
。为了解决这些问题,你可以尝试以下方法:
Mutex
对out
进行线程安全访问,确保只有一个线程同时访问和修改out
。下面是一个示例代码片段,其中添加了一些延时和检查WebSocket连接状态的逻辑:
use std::time::Duration;use websocket::{Message, Result};// ... 其他代码 ...let out = Arc::new(Mutex::new(out));let temp_out = out.lock().unwrap();let send_msg = serde_json::to_string(&mark_price_channel).unwrap();print!("{:?}", send_msg);// 延时一段时间以确保WebSocket连接建立完成thread::sleep(Duration::from_secs(3));if let Err(e) = temp_out.send(Message::Text(send_msg)) { if let Err(e) = temp_out.send(Message::Ping(vec![])) { println!("Error sending a message: {:?}", e); } else { println!("Sent ping to keep the connection alive"); }} else { println!("Sent message: {}", send_msg);}
请注意,这只是一个示例代码片段,并不能保证完全解决你的问题。你需要根据你的具体情况进行调整和修改。同时,建议仔细阅读相关的文档和资料,以便更好地理解Rust中的并发和线程安全编程。
请问,我看有些代码明明可以使用 let a = Arc<T> 的形式,但却使用的是 let a = Arc<Box<T>> 这样多包含了一层box, 请问是有什么原因?谢谢
如果运行上面的程序,会报错误 修复的方法可以是 这个问题应该是和 rust 所有权有关,当方法返回时会出现所有权移动。一开始认为可能是结构体内的字段无法移动所有权。但是执行 报错的原因应该是所有权移动后, animate.name 就失效了,按这么说结构体内的字段是可以移动所有权的。 那最上面的报错应该怎么比较好去理解?
这用于创建弧形。 语法 (Syntax) 以下是添加弧的简单语法。 xtype: 'draw', type: 'arc' 例子 (Example) 以下是一个显示用法的简单示例。 <!DOCTYPE html> <html> <head> <link href = "https://cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/class
弧是曲线的一部分。 它由以下属性描述 - length - 沿弧的距离。 angle - 曲线在圆心处的角度。 radiusX - 当前弧所属的完整Ellipse的宽度。 radiusY - 当前弧所属的完整Ellipse的高度。 在JavaFX中,弧由名为Arc的类表示。 该类属于包javafx.scene.shape 。 通过实例化此类,您可以在JavaFX中创建弧节点。 这个类有一些doub
iToast的ARC版本,在此版本上修改: https://github.com/ecstasy2/toast-notifications-ios 增加了自定义的一些方法。
问题内容: 根据这些评论,JSONKit不支持ARC,甚至在ARC环境中都不使用fobjc-no- arc设置运行:https : //github.com/johnezang/JSONKit/issues/37 问题答案: 您仍然可以在ARC应用程序中使用JSONKit。 我自己用的。 在XCode 5中选择项目根目录,在“ 选择应用程序”下,然后选择“ 选项卡”。在JSONKit.m 下,双击