Guest User

Untitled

a guest
Jun 19th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. extern crate ws;
  2.  
  3. use std::cmp::min;
  4. use std::sync::mpsc::{self, Receiver};
  5. use std::thread;
  6.  
  7. use ws::{connect, listen, CloseCode, Handler, Handshake, Message, Result, Sender};
  8.  
  9. pub struct Server<'a> {
  10. pub socket: Sender,
  11. pub msgs: &'a Receiver<Vec<String>>
  12. }
  13.  
  14. pub struct Client<F: FnMut(String)> {
  15. pub socket: Sender,
  16. pub dispatch: F
  17. }
  18.  
  19. impl<'a> Handler for Server<'a> {
  20. fn on_open(&mut self, shake: Handshake) -> Result<()> {
  21. let resource = shake.request.resource();
  22. let client_ip = shake.remote_addr();
  23. println!("Client has connected");
  24. println!("{:?}\n{:?}", client_ip, resource);
  25. for m in self.msgs.try_iter() {
  26. self.socket.send(format!("{:?}", m)).unwrap();
  27. println!("{:?}", m);
  28. }
  29.  
  30. Ok(())
  31. }
  32.  
  33. fn on_message(&mut self, msg: Message) -> Result<()> {
  34. println!("Client has sent a message: {:?}", msg);
  35. Ok(())
  36. }
  37.  
  38. fn on_close(&mut self, code: CloseCode, reason: &str) {
  39. match code {
  40. CloseCode::Normal => println!("Client has terminated connection"),
  41. CloseCode::Away => println!("Client has left"),
  42. _ => println!("Error: {:?}", reason)
  43. }
  44. }
  45. }
  46.  
  47. impl<F: FnMut(String)> Handler for Client<F> {
  48. fn on_message(&mut self, msg: Message) -> Result<()> {
  49. (self.dispatch)(msg.to_string());
  50. Ok(())
  51. }
  52.  
  53. fn on_close(&mut self, code: CloseCode, reason: &str) {
  54. match code {
  55. CloseCode::Normal => println!("Client has terminated connection"),
  56. CloseCode::Away => println!("Client has left"),
  57. _ => println!("Error: {:?}", reason)
  58. }
  59. }
  60. }
  61.  
  62. fn main () {
  63. let s = "adausdt@depth10/btcusdt@depth10/ethusdt@depth10/ltcusdt@depth10".to_string();
  64. let b = "wss://stream.binance.com:9443/stream?streams=".to_string() + s.as_str();
  65. let (dispatcher, receiver) = mpsc::channel();
  66. let (sender, getter) = mpsc::channel();
  67. let mut msgs: Vec<String> = vec![];
  68.  
  69. let s = thread::spawn(move || {
  70. for msg in receiver {
  71. msgs.insert(0, msg);
  72. // sender.send(&msg.clone().to_string()).unwrap();
  73. sender.send(msgs[0..(min(msgs.len(), 1))].to_vec()).unwrap();
  74. println!("Messages stored: {:?}", msgs.len());
  75. }
  76. });
  77.  
  78. let wsc = thread::spawn(move || {
  79. if let Err(error) = connect(b, |socket| {
  80. let d = dispatcher.clone();
  81. Client { socket, dispatch: move |v| d.send(v).unwrap() }
  82. }) {
  83. println!("{:?}", error);
  84. }
  85. });
  86.  
  87. let wss = thread::spawn(move || {
  88. println!("WebSocket Server Online");
  89. if let Err(error) = listen("127.0.0.1:4040", |socket| {
  90. Server { socket, msgs: &getter }
  91. }) {
  92. println!("Failed to create Websocket Server: {:?}", error);
  93. }
  94. });
  95.  
  96. s.join().unwrap();
  97. wsc.join().unwrap();
  98. wss.join().unwrap();
  99. }
Add Comment
Please, Sign In to add comment