我正在使用标准库中的TcpStream来处理IRC机器人。
我能够读取所有进入的行,但是IRC服务器似乎没有响应我的识别请求。我以为我过早发送请求所以我在发送IDENT之前尝试了睡觉,但这不起作用。我使用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();
}
答案 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
保留内存缓冲区 数据并将其写入大,不常见的基础编写器 批次强>当写入程序被删除时,将写出缓冲区。
另一种说法是,缓冲的读者或作者的整个目的是BufWriter
或read
请求不有一个一对一映射到底层流。
这意味着当您致电write
时,您只是将写入缓冲区。如果需要确保将字节写入基础流,还需要调用flush
。
此外,你应该:
write
,read
和write
可能产生的错误。 flush
和read
并不保证他们读取或写入您要求的数据量。它们可能会执行部分读取或写入操作,您可以自行处理。这就是为什么有write
或read_to_end
等辅助方法。write_all
。否则,每次循环循环时输出都会重复。String
而不是构建一个立即丢弃的字符串。write!
通过这些更改,我能够从服务器收到fn write_line(&mut self, string: &str) {
write!(self.writer, "{}\r\n", string).unwrap();
self.writer.flush().unwrap();
}
消息。