mirror of
https://github.com/Noratrieb/terminal-chat.git
synced 2026-01-14 16:35:10 +01:00
60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
use std::io::{self, Read, Write};
|
|
use std::net::{TcpListener, TcpStream};
|
|
use std::error::Error;
|
|
use std::sync::mpsc::{Receiver, Sender};
|
|
use std::time::Duration;
|
|
|
|
type StreamResult = Result<TcpStream, Box<dyn Error>>;
|
|
|
|
|
|
pub fn listen() -> StreamResult {
|
|
println!("Listening on {}:8080", local_ipaddress::get().unwrap());
|
|
let listener = TcpListener::bind(("0.0.0.0", 8080))?;
|
|
let stream = listener.incoming().next().unwrap()?;
|
|
println!("Connected.");
|
|
println!("other adress: {}", stream.peer_addr()?.ip());
|
|
|
|
Ok(stream)
|
|
}
|
|
|
|
pub fn connect(address: String, port: String) -> StreamResult {
|
|
println!("Trying to connect to '{}:{}'", &address, &port);
|
|
|
|
let port: u16 = port.parse()?;
|
|
let stream = TcpStream::connect((&*address, port))?;
|
|
|
|
println!("Connected.");
|
|
println!("other adress: {}", stream.peer_addr()?.ip());
|
|
|
|
Ok(stream)
|
|
}
|
|
|
|
|
|
pub fn network_thread(mut stream: TcpStream, rx: Receiver<String>) {
|
|
let mut data = [0u8; 255]; // using 50 byte buffer
|
|
stream.set_read_timeout(Some(Duration::from_millis(500))).expect("Could not set timeout");
|
|
loop {
|
|
if let Ok(_) = stream.read(&mut data) {
|
|
println!("> {}", String::from_utf8_lossy(&data));
|
|
data = [0u8; 255];
|
|
}
|
|
if let Ok(v) = rx.recv_timeout(Duration::from_millis(200)) {
|
|
stream.write(v.as_bytes()).expect("could not send message");
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn ui_thread(sx: Sender<String>) {
|
|
println!("You can now write messages to your peer!");
|
|
loop {
|
|
let input = input();
|
|
sx.send(input).expect("could not send value");
|
|
}
|
|
}
|
|
|
|
|
|
pub fn input() -> String {
|
|
let mut buffer = String::new();
|
|
let _ = io::stdin().read_line(&mut buffer);
|
|
buffer.trim().to_string()
|
|
}
|