IRC 服务器不响应 Rust IRC 客户端识别请求



我正在使用标准库中的TcpStream开发IRC机器人。

我能够读取所有传入的行,但 IRC 服务器似乎没有响应我的识别请求。我以为我发送请求太早了,所以我尝试在发送 IDENT 之前睡觉,但这不起作用。我使用两种BufReaderBufWriter和直接在流上调用readwrite来写作,但无济于事。

use std::net::TcpStream;
use std::io::{BufReader, BufWriter, BufRead, Write, Read};
use std::{thread, time};
struct Rusty {
name: String,
stream: TcpStream,
reader: BufReader<TcpStream>,
writer: BufWriter<TcpStream>,
}
impl Rusty {
fn new(name: &str, address: &str) -> Rusty {
let stream = TcpStream::connect(address).expect("Couldn't connect to server");
let reader = BufReader::new(stream.try_clone().unwrap());
let writer = BufWriter::new(stream.try_clone().unwrap());
Rusty {
name: String::from(name),
reader: reader,
writer: writer,
stream: stream,
}
}
fn write_line(&mut self, string: String) {
let line = format!("{}rn", string);
&self.writer.write(line.as_bytes());
}
fn identify(&mut self) {
let nick = &self.name.clone();
self.write_line(format!("USER {} {} {} : {}", nick, nick, nick, nick));
self.write_line(format!("NICK {}", nick));
}
fn read_lines(&mut self) {
let mut line = String::new();
loop {
self.reader.read_line(&mut line);
println!("{}", line);
}
}
}
fn main() {
let mut bot = Rusty::new("rustyrusty", "irc.rizon.net:6667");
thread::sleep_ms(5000);
bot.identify();
bot.read_lines();
}

阅读我们在编程时使用的组件的文档非常重要。例如,BufWriter状态的文档(强调我的):

包装编写器并缓冲其输出。

直接处理以下内容可能效率太低 实现Write.例如,每次调用写入TcpStream导致系统调用。BufWriter将内存中缓冲区保留为 数据,并将其大量、不频繁地写入底层编写器 批次

删除写入器时,缓冲区将被写出。

换句话说,缓冲读取器或编写器的全部用途readwrite请求没有到基础流的一对一映射。

这意味着当你调用write时,你只是在写入缓冲区。如果需要确保将字节写入基础流,则还需要调用flush


此外,您应该:

  1. 处理readwriteflush可能产生的错误。
  2. 重新熟悉每个函数的功能。例如,readwrite不保证他们读取或写入的数据量与您要求他们一样多。他们可能会执行部分读取或写入,由您来处理。这就是为什么有像read_to_endwrite_all这样的辅助方法。
  3. 清除您正在阅读的String。否则,每次循环循环时,输出都会重复。
  4. 使用write!而不是建立一个立即扔掉的字符串。
fn write_line(&mut self, string: &str) {
write!(self.writer, "{}rn", string).unwrap();
self.writer.flush().unwrap();
}

通过这些更改,我能够从服务器获得PING消息。

最新更新