Skip to content

Commit 88280d1

Browse files
committed
改造消息架构
1 parent c652d82 commit 88280d1

File tree

1 file changed

+83
-64
lines changed

1 file changed

+83
-64
lines changed

dsweb-core/src/server.rs

Lines changed: 83 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,59 @@ use crate::screen::Cap;
44
use enigo::Enigo;
55
use enigo::KeyboardControllable;
66
use enigo::MouseControllable;
7-
use flate2::Compression;
87
use flate2::write::DeflateEncoder;
9-
use websocket::OwnedMessage;
10-
use websocket::sync::Reader;
11-
use websocket::sync::Server;
12-
use websocket::sync::Writer;
8+
use flate2::Compression;
139
use std::io::Write;
1410
use std::net::Ipv4Addr;
1511
use std::net::SocketAddrV4;
1612
use std::net::TcpStream;
17-
use std::sync::Arc;
1813
use std::sync::atomic::AtomicBool;
1914
use std::sync::atomic::Ordering;
15+
use std::sync::Arc;
16+
use websocket::sync::Reader;
17+
use websocket::sync::Server;
18+
use websocket::sync::Writer;
19+
use websocket::OwnedMessage;
2020

2121
pub fn run(port: u16) {
2222
let host = SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), port);
2323
let server = Server::bind(host).unwrap();
24+
let isctrl = Arc::new(AtomicBool::new(false));
2425
for request in server.filter_map(Result::ok) {
25-
if !request.protocols().contains(&"diffscreen".to_string()) {
26+
if request.protocols().len() != 1 {
2627
request.reject().unwrap();
2728
continue;
2829
}
29-
println!("New income !");
30-
let client = request.use_protocol("diffscreen").accept().unwrap();
31-
let (receiver, sender) = client.split().unwrap();
32-
let running = Arc::new(AtomicBool::new(true));
33-
let th1run = running.clone();
34-
let _ = std::thread::spawn(move || {
35-
screen_stream(sender, th1run);
36-
});
37-
let th = std::thread::spawn(move || {
38-
event(receiver);
39-
});
40-
let _ = th.join();
41-
running.store(false, Ordering::Relaxed);
42-
println!("Break !");
30+
let proto = request.protocols()[0].as_str();
31+
match proto {
32+
"diffscreen" => {
33+
if isctrl.load(Ordering::Relaxed) {
34+
request.reject().unwrap();
35+
continue;
36+
}
37+
println!("New income !");
38+
let client = request.use_protocol("diffscreen").accept().unwrap();
39+
let (receiver, sender) = client.split().unwrap();
40+
isctrl.store(true, Ordering::Relaxed);
41+
let isctrlc = isctrl.clone();
42+
let _ = std::thread::spawn(move || {
43+
screen_stream(sender, isctrlc);
44+
});
45+
let isctrlc = isctrl.clone();
46+
let _ = std::thread::spawn(move || {
47+
event(receiver);
48+
isctrlc.store(false, Ordering::Relaxed);
49+
println!("Break !");
50+
});
51+
}
52+
"paste" => {
53+
// 处理粘贴
54+
}
55+
_ => {
56+
request.reject().unwrap();
57+
continue;
58+
}
59+
}
4360
}
4461
}
4562

@@ -53,56 +70,52 @@ fn event(mut stream: Reader<TcpStream>) {
5370
Ok(message) => message,
5471
Err(e) => {
5572
eprintln!("Msg err {}", e);
56-
continue;
73+
return;
5774
}
5875
};
5976
match message {
60-
OwnedMessage::Binary(cmd) => {
61-
match cmd[0] {
62-
dscom::KEY_UP => {
63-
if let Some(key) = key_mouse::key_to_enigo(cmd[1]) {
64-
enigo.key_up(key);
65-
}
66-
}
67-
dscom::KEY_DOWN => {
68-
if let Some(key) = key_mouse::key_to_enigo(cmd[1]) {
69-
enigo.key_down(key);
70-
}
77+
OwnedMessage::Binary(cmd) => match cmd[0] {
78+
dscom::KEY_UP => {
79+
if let Some(key) = key_mouse::key_to_enigo(cmd[1]) {
80+
enigo.key_up(key);
7181
}
72-
dscom::MOUSE_KEY_UP => {
73-
if let Some(key) = key_mouse::mouse_to_engin(cmd[1]) {
74-
enigo.mouse_up(key);
75-
}
76-
}
77-
dscom::MOUSE_KEY_DOWN => {
78-
if let Some(key) = key_mouse::mouse_to_engin(cmd[1]) {
79-
enigo.mouse_down(key);
80-
}
81-
}
82-
dscom::MOUSE_WHEEL_UP => {
83-
enigo.mouse_scroll_y(-2);
84-
}
85-
dscom::MOUSE_WHEEL_DOWN => {
86-
enigo.mouse_scroll_y(2);
82+
}
83+
dscom::KEY_DOWN => {
84+
if let Some(key) = key_mouse::key_to_enigo(cmd[1]) {
85+
enigo.key_down(key);
8786
}
88-
dscom::MOVE => {
89-
let x = ((cmd[1] as i32) << 8) | (cmd[2] as i32);
90-
let y = ((cmd[3] as i32) << 8) | (cmd[4] as i32);
91-
enigo.mouse_move_to(x, y);
87+
}
88+
dscom::MOUSE_KEY_UP => {
89+
if let Some(key) = key_mouse::mouse_to_engin(cmd[1]) {
90+
enigo.mouse_up(key);
9291
}
93-
_ => {
94-
return;
92+
}
93+
dscom::MOUSE_KEY_DOWN => {
94+
if let Some(key) = key_mouse::mouse_to_engin(cmd[1]) {
95+
enigo.mouse_down(key);
9596
}
9697
}
97-
}
98+
dscom::MOUSE_WHEEL_UP => {
99+
enigo.mouse_scroll_y(-2);
100+
}
101+
dscom::MOUSE_WHEEL_DOWN => {
102+
enigo.mouse_scroll_y(2);
103+
}
104+
dscom::MOVE => {
105+
let x = ((cmd[1] as i32) << 8) | (cmd[2] as i32);
106+
let y = ((cmd[3] as i32) << 8) | (cmd[4] as i32);
107+
enigo.mouse_move_to(x, y);
108+
}
109+
_ => {
110+
return;
111+
}
112+
},
98113
OwnedMessage::Close(_) => {
99114
println!("Front close !");
100115
return;
101116
}
102-
_=> {
103-
}
117+
_ => {}
104118
}
105-
106119
}
107120
}
108121

@@ -114,11 +127,17 @@ fn get_data(data: OwnedMessage) -> Vec<u8> {
114127
}
115128

116129
/// 初始化rgb块
117-
fn get_rgb_block(w: usize, h: usize, sw: usize, sh: usize, offset: usize) -> (Vec<Vec<u8>>, usize, usize) {
118-
let srw = (w / sw) + if w % sw == 0 {0usize} else {1usize};
119-
let srh = (h / sh) + if h % sh == 0 {0usize} else {1usize};
130+
fn get_rgb_block(
131+
w: usize,
132+
h: usize,
133+
sw: usize,
134+
sh: usize,
135+
offset: usize,
136+
) -> (Vec<Vec<u8>>, usize, usize) {
137+
let srw = (w / sw) + if w % sw == 0 { 0usize } else { 1usize };
138+
let srh = (h / sh) + if h % sh == 0 { 0usize } else { 1usize };
120139
let num = srw * srh;
121-
let mut buf = vec![vec![0u8;offset + sw*sh*3];num];
140+
let mut buf = vec![vec![0u8; offset + sw * sh * 3]; num];
122141
for i in 0..(srw * srh) {
123142
buf[i][offset - 2] = (i >> 8) as u8;
124143
buf[i][offset - 1] = i as u8;
@@ -129,7 +148,7 @@ fn get_rgb_block(w: usize, h: usize, sw: usize, sh: usize, offset: usize) -> (Ve
129148
fn ws_send(mut stream: Writer<TcpStream>, data: Vec<u8>) -> (Writer<TcpStream>, Vec<u8>) {
130149
let om = OwnedMessage::Binary(data);
131150
stream.send_message(&om).unwrap();
132-
return (stream, get_data(om))
151+
return (stream, get_data(om));
133152
}
134153

135154
fn screen_stream(mut stream: Writer<TcpStream>, running: Arc<AtomicBool>) {
@@ -139,7 +158,7 @@ fn screen_stream(mut stream: Writer<TcpStream>, running: Arc<AtomicBool>) {
139158
let block_len = srw * srh;
140159
let (mut b, _, _) = get_rgb_block(w, h, sw, sh, 2);
141160
// 发送w, h, sw, sh, mask
142-
let mut meta = vec![0u8;9];
161+
let mut meta = vec![0u8; 9];
143162
meta[0] = (w >> 8) as u8;
144163
meta[1] = w as u8;
145164
meta[2] = (h >> 8) as u8;

0 commit comments

Comments
 (0)