Tcp IRC服务器没有';不响应Rust IRC客户端识别请求
我正在使用标准库中的TcpStream开发一个IRC机器人 我能够阅读所有输入的行,但是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
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();
}