IRC服务器不响应Rust IRC Client识别请求

时间:2017-06-19 20:41:15

标签: tcp 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!("{}\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();
}

1 个答案:

答案 0 :(得分:3)

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

  

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

     

直接使用某些东西可能效率过低   实现import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-about-page', templateUrl: './about-page.component.html', styleUrls: ['./about-page.component.css'] }) export class AboutPageComponent implements OnInit { showSystemRequirements: boolean = false; showPSAT: boolean = false; showPHAST: boolean = false; constructor() { } ngOnInit() { } toggleShowSystemRequirements() { this.showSystemRequirements = !this.showSystemRequirements; } toggleShowPSAT() { this.showPSAT = !this.showPSAT; } toggleShowPHAST() { this.showPHAST = !this.showPHAST; } } 。例如,每次拨打Write的电话   导致系统调用。 TcpStream保留内存缓冲区   数据并将其写入大,不常见的基础编写器   批次

     

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

另一种说法是,缓冲的读者或作者的整个目的BufWriterread请求有一个一对一映射到底层流。

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

此外,你应该:

  1. 处理writereadwrite可能产生的错误。
  2. 重新熟悉每个功能的功能。例如,flushread并不保证他们读取或写入您要求的数据量。它们可能会执行部分读取或写入操作,您可以自行处理。这就是为什么有writeread_to_end等辅助方法。
  3. 清除您正在阅读的write_all。否则,每次循环循环时输出都会重复。
  4. 使用String而不是构建一个立即丢弃的字符串。
  5. write!

    通过这些更改,我能够从服务器收到fn write_line(&mut self, string: &str) { write!(self.writer, "{}\r\n", string).unwrap(); self.writer.flush().unwrap(); } 消息。