Skip to content

Create socket.rs #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions socket.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
extern mod sync;

// str op trait
use std::str::StrSlice;
// for tcp listen
use std::io::{TcpListener, TcpStream};
use std::io::net::ip::SocketAddr;
// for trait
use std::io::{Listener, Writer, Acceptor, Buffer};
// for spawn
use std::task::spawn;
// for read_line
use std::io::BufferedStream;
// for gathering chat msg
use std::comm::SharedChan;
// for chat msg storage
use sync::RWArc;


fn chat_loop(ss: &mut BufferedStream<TcpStream>, chan: SharedChan<~str>, arc: RWArc<~[~str]>) {
ss.write(bytes!("Welcome to Simple Chat Server!\n"));
ss.write(bytes!("Plz input yourname: "));
ss.flush();
let mut name : ~str = ss.read_line().unwrap();
name = name.trim_right().into_owned();
ss.write_str(format!("Hello, {}!\n", name));
ss.flush();
let mut pos = 0;
loop {
arc.read(|lines| {
println!("DEBUG arc.read() => {}", lines.to_str());
for i in range(pos, lines.len()) {
ss.write_str(lines[i]);
}
pos = lines.len();
});
ss.write(bytes!(" > "));
ss.flush();
let reads = ss.read_line().unwrap();
if reads.trim().len() != 0 {
println!("DEBUG reads len =>>>>> {}", reads.len());
chan.send(format!("[{}] said: {}", name, reads));
println!("DEBUG: got '{}' from {}", reads.trim(), name);
}
}
}

fn main () {
//let ip : IpAddr = from_str("127.0.0.1").unwrap();
//let addr = SocketAddr{ip:ip, port:8888};
let addr : SocketAddr = from_str("127.0.0.1:8888").unwrap();

let listener = TcpListener::bind(addr).unwrap();
let mut acceptor = listener.listen().unwrap();
let (port, chan) : (Port<~str>, SharedChan<~str>)= SharedChan::new();
let arc : RWArc<~[~str]> = RWArc::new(~[]);

let arc_w = arc.clone();
spawn(proc() {
loop {
let msg = port.recv();
print!("DEBUG: {}", msg);
arc_w.write(|lines| lines.push(msg.to_str()));
}
});
loop {
match acceptor.accept() {
Err(_) => println!("error listen"),
Ok(mut stream) => {
println!("DEBUG: got connection from {} to {}",
stream.peer_name().unwrap().to_str(),
stream.socket_name().unwrap().to_str());
let chan = chan.clone();
let arc = arc.clone();
spawn(proc() {
let mut stream = BufferedStream::new(stream);
chat_loop(&mut stream, chan, arc);
});
}
}
}
}