blob: 0d37d6a166b4d656405c6432370135279a8203fc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
use std::io;
use std::io::{Read, Write};
use std::mem::transmute;
pub struct StreamConnection<T: Read+Write> {
pub stream: T,
buffer: Vec<u8>
}
impl <T: Read+Write> StreamConnection<T> {
pub fn new(stream: T) -> StreamConnection<T> {
StreamConnection {
stream,
buffer: Vec::new()
}
}
pub fn read(&mut self) -> Result<(Vec<String>, bool), io::Error> {
let mut buf = [0; 2048];
let mut closed = false;
loop {
match self.stream.read(&mut buf) {
Err(e) => {
if e.kind() == io::ErrorKind::WouldBlock {
break;
} else {
return Err(e);
}
}
Ok(0) => {
closed = true;
break;
}
Ok(i) => {
self.buffer.extend_from_slice(&buf[..i]);
// messages.push(String::from_utf8_lossy(&buf[..i]).to_string());
}
}
}
let mut messages = Vec::new();
while self.buffer.len() >= 4 {
let mut header: [u8; 4] = [0;4];
header.copy_from_slice(&self.buffer[..4]);
let mlen: usize = u32::from_be(unsafe { transmute(header) }) as usize;
if self.buffer.len() - 4 < mlen {
break;
}
let rest = self.buffer.split_off(4+mlen);
let message = String::from_utf8_lossy(&self.buffer[4..]).to_string();
messages.push(message);
self.buffer = rest;
}
Ok((messages, closed))
}
pub fn send(&mut self, text: &str) -> Result<(), io::Error> {
let bytes: &[u8] = text.as_bytes();
let len: u32 = bytes.len() as u32;
let header: [u8; 4] = unsafe { transmute(len.to_be()) };
self.stream.write_all(&header)?;
self.stream.write_all(bytes)
}
}
|