# rust-atpp tcp network protocol ## Use atpp ```ini [dependencies.atpp] version = "*" ``` If you want to use the git version: ```ini [dependencies.atpp] git = "https://github.com/gitxpj/rust-atpp.git" ``` ## For server example ```rust,no_run extern crate atpp; use atpp::{AtppHandle, AtppStartPackage, AtppDataPackage, AtppEndPackage, AtppAdapter, AtppError}; use std::thread; use std::io::prelude::{Read, Write}; use std::net::{TcpListener, TcpStream, Shutdown}; struct TestRecvHandle; impl TestRecvHandle { fn new() -> TestRecvHandle { TestRecvHandle } } impl AtppHandle for TestRecvHandle { fn OnStart(&self, stream: &mut TcpStream, pkg: AtppStartPackage) { println!("{:?}", pkg); } fn OnData(&self, stream: &mut TcpStream, pkg: AtppDataPackage, data: &mut Vec) { println!("{:?}", pkg); } fn OnEnd(&self, stream: &mut TcpStream, pkg: AtppEndPackage) { println!("{:?}", pkg); } } fn main() { let sock = match TcpListener::bind("127.0.0.1:35589") { Ok(e) => e, Err(_) => panic!("Can't bind address! host 127.0.0.1, port 35589"), }; println!("Server running on the 127.0.0.1:35589"); for stream in sock.incoming() { match stream { Err(e) => { println!("Accept client has fail! {}", e); }, Ok(stream) => { println!("Got connection!"); thread::spawn(move || { let mut handle: TestRecvHandle = TestRecvHandle::new(); handle_client(stream,&mut handle) }); } } } } fn handle_client(stream: TcpStream, handle: &mut AtppHandle) { let mut stream = stream; let mut last_buf: Vec = Vec::new(); let adapter: AtppAdapter = AtppAdapter::new(handle); loop { let mut buf = Vec::new(); let mut raw_buf: [u8; 4096] = [0u8; 4096]; let mut size = match stream.read(&mut raw_buf) { Ok(e) => e, Err(_) => { println!("Receive wrong shutdown socket!"); break; }, }; if !last_buf.is_empty() { buf.write(&*last_buf); last_buf.clear(); } buf.write(&raw_buf[..size]); match adapter.unpack(&mut stream, &mut buf) { Ok(e) => { match e { Some(e) => { last_buf.write(&*e); }, None => {}, } }, Err(e) => { match e { AtppError::BROKE_DATA(s) => { println!("{:?}", s); }, _ => { println!("Other Error"); } } } }; } } ```