Tcp IRC服务器没有';不响应Rust IRC客户端识别请求

Tcp IRC服务器没有';不响应Rust IRC客户端识别请求,tcp,rust,irc,Tcp,Rust,Irc,我正在使用标准库中的TcpStream开发一个IRC机器人 我能够阅读所有输入的行,但是IRC服务器似乎没有响应我的识别请求。我认为我发送请求太快了,所以在发送身份证之前我试着睡觉,但这不起作用。我使用BufReader,BufWriter和直接在流上调用read和write进行写入,但都没有效果 use std::net::TcpStream; use std::io::{BufReader, BufWriter, BufRead, Write, Read}; use std::{thread

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

我能够阅读所有输入的行,但是IRC服务器似乎没有响应我的识别请求。我认为我发送请求太快了,所以在发送身份证之前我试着睡觉,但这不起作用。我使用
BufReader
BufWriter
和直接在流上调用
read
write
进行写入,但都没有效果

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!("{}\r\n", 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();
}
使用std::net::TcpStream;
使用std::io::{BufReader,BufWriter,BufRead,Write,Read};
使用std::{thread,time};
结构生锈{
名称:String,
流:TcpStream,
读者:BufReader,
作者:BufWriter,
}
铁锈{
fn新(名称:&str,地址:&str)->Rusty{
让stream=TcpStream::connect(address).expect(“无法连接到服务器”);
让reader=BufReader::new(stream.try_clone().unwrap());
让writer=BufWriter::new(stream.try_clone().unwrap());
生锈的{
name:String::from(name),
读者:读者,
作者:作者,,
小溪:小溪,
}
}
fn写入行(&mut self,string:string){
让line=format!(“{}\r\n”,字符串);
&self.writer.write(line.as_bytes());
}
fn标识(和多个自身){
让nick=&self.name.clone();
self.write_行(格式!(“用户{}{}{}:{}”,尼克,尼克,尼克));
self.write_行(格式!(“NICK{}”,NICK));
}
fn读取行(&mut self){
让mut line=String::new();
环路{
self.reader.read_行(&mut行);
println!(“{}”,行);
}
}
}
fn main(){
让mut-bot=Rusty::new(“rustyrusty”,“irc.rizon.net:6667”);
线程:sleep_ms(5000);
bot.identify();
bot.read_line();
}

阅读编程时使用的组件的文档非常重要。例如,各州的文件(重点):

包装写入程序并缓冲其输出

直接处理那些 实现
写入
。例如,每次调用
TcpStream
导致系统调用。
BufWriter
在内存中保留 数据并将其写入大型且不频繁的底层写入程序 批处理

当删除写入程序时,将写入缓冲区

换句话说,缓冲读写器的全部用途是
read
write
请求不具有到底层流的一对一映射

这意味着当您调用
write
时,您只是在向缓冲区写入数据。如果需要确保将字节写入底层流,还需要调用


此外,您应该:

  • 处理由
    读取
    写入
    刷新
    引起的错误
  • 重新熟悉每个功能的功能。例如,
    read
    write
    不能保证他们按照您的要求读取或写入尽可能多的数据。它们可能执行部分读或写操作,这取决于您如何处理。这就是为什么会有像
    read\u to\u end
    write\u all
    这样的助手方法
  • 清除正在读取的
    字符串。否则,每次循环循环时输出都会重复
  • 使用
    write而不是构建一个立即丢弃的字符串

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

    您是否考虑过修复编译器已经告诉您的警告?如果没有,也许你会分享你为什么选择忽略这些警告。我得到的警告都是死代码错误。我认为这还不够相关,不,它们不相关。如果您要花时间删除警告,您会注意到您正在调用一个可能失败的方法,但忽略了潜在的失败。您正在使用哪个IRC协议源?我所做的快速搜索与您发送的数据格式不一致,因此,除了您实际正在做的事情之外,最好能看到您正在尝试做什么。
    fn write_line(&mut self, string: &str) {
        write!(self.writer, "{}\r\n", string).unwrap();
        self.writer.flush().unwrap();
    }