use std::io::{BufReader, BufWriter};
use std::net::{TcpListener, TcpStream};
use std::thread;
use binseq::bq::{FileHeader, FileHeaderBuilder, StreamReader, StreamWriterBuilder};
use binseq::{BinseqRecord, Policy, Result};
fn server(header: FileHeader, sequence: &[u8]) -> Result<()> {
let listener = TcpListener::bind("127.0.0.1:3000").expect("Failed to bind to address");
println!("Server listening on 127.0.0.1:3000");
let (stream, _) = listener.accept().expect("Failed to accept connection");
println!("Client connected");
let stream = BufWriter::new(stream);
let mut writer = StreamWriterBuilder::default()
.header(header)
.policy(Policy::RandomDraw)
.buffer_capacity(16384) .build(stream)?;
for i in 0..10 {
#[allow(deprecated)]
writer.write_record(Some(i), sequence)?;
println!("Server: Sent record {i}");
thread::sleep(std::time::Duration::from_millis(100));
}
writer.flush()?;
println!("Server: All records sent");
Ok(())
}
fn client() -> Result<()> {
thread::sleep(std::time::Duration::from_millis(500));
let stream = TcpStream::connect("127.0.0.1:3000").expect("Failed to connect to server");
println!("Connected to server");
let reader = BufReader::new(stream);
let mut reader = StreamReader::new(reader);
let header = reader.read_header()?;
println!(
"Client: Received header with sequence length = {}",
header.slen
);
let mut count = 0;
while let Some(record) = reader.next_record() {
let record = record?;
println!(
"Client: Received record {} with flag = {:?}",
count,
record.flag()
);
count += 1;
}
println!("Client: Received {count} records total");
Ok(())
}
fn main() -> Result<()> {
let header = FileHeaderBuilder::new().slen(100).build()?;
let sequence = b"ACGT".repeat(25);
let server_thread = thread::spawn(move || {
if let Err(e) = server(header, &sequence) {
eprintln!("Server error: {e:?}");
}
});
if let Err(e) = client() {
eprintln!("Client error: {e:?}");
}
server_thread.join().unwrap();
Ok(())
}