< 返回版块

qianjunjushi 发表于 2021-10-05 13:38

Tags:tokio,async,reconnect

大家还在还在过节吗,哈哈 问一个小白问题哦: 我有一个场景,作为客户端,我要和服务器保持连接(如果断了,就重新发起连接),我要接受上游的数据,然后转发给服务端,接受服务端回的数据,也同时返回给上游。我想了很久,总想不到自己满意的逻辑,请问大家遇到这种自动重连的客户端怎么写的呢 对了 我是异步环境。 1 接受上游数据 转发服务端 2 接受上游命令结束本task 3 接受服务器数据 返回给上游 4 如果链接断开,尝试重连,并定期发送在线状态给上游 纠结点 使用loop select 来接受上游数据 ,转发给tcpstream 但是这个stream 不一定存在 因为stream 不一定存在 我又没办法在select 中添加接受stream的数据 往上游送

评论区

写评论
johnmave126 2021-10-08 11:31

加了

--
👇
qianjunjushi: 非常感谢您抽空回复我,看来我是遇到大神了,方便加个qq 交流吗,我初学,rust现阶段有些资料比较少,有些问题不是很懂,但是我会尽量少打扰您的。我的扣扣 6909零八238

--
👇
johnmave126: 有点不确定这玩意能不能unpin,反正遇事不决Box

--
👇
johnmave126: 手动套其实不麻烦

然后我不是很懂需要你说唤醒是怎么回事,感觉你这次序颠倒了。讲到底是future唤醒executor,你完全可以在loop-select里重连上了以后直接Option::insert,下次select的时候就会poll新的stream了。

--
👇
qianjunjushi:

谢谢您的回复,如果是这样那就需要实现future 了 ,那如果重连连上了 pend又要唤醒 ,比较复杂了

作者 qianjunjushi 2021-10-06 16:03

非常感谢您抽空回复我,看来我是遇到大神了,方便加个qq 交流吗,我初学,rust现阶段有些资料比较少,有些问题不是很懂,但是我会尽量少打扰您的。我的扣扣 6909零八238

--
👇
johnmave126: 有点不确定这玩意能不能unpin,反正遇事不决Box

--
👇
johnmave126: 手动套其实不麻烦

然后我不是很懂需要你说唤醒是怎么回事,感觉你这次序颠倒了。讲到底是future唤醒executor,你完全可以在loop-select里重连上了以后直接Option::insert,下次select的时候就会poll新的stream了。

--
👇
qianjunjushi:

谢谢您的回复,如果是这样那就需要实现future 了 ,那如果重连连上了 pend又要唤醒 ,比较复杂了

johnmave126 2021-10-06 13:24

有点不确定这玩意能不能unpin,反正遇事不决Box

--
👇
johnmave126: 手动套其实不麻烦

然后我不是很懂需要你说唤醒是怎么回事,感觉你这次序颠倒了。讲到底是future唤醒executor,你完全可以在loop-select里重连上了以后直接Option::insert,下次select的时候就会poll新的stream了。

--
👇
qianjunjushi:

谢谢您的回复,如果是这样那就需要实现future 了 ,那如果重连连上了 pend又要唤醒 ,比较复杂了

johnmave126 2021-10-06 13:21

手动套其实不麻烦

#[pin_project]
struct MaybeTcpStream(#[pin] Option<TcpStream>);

impl AsyncRead for MaybeTcpStream {
    fn poll_read(
        self: Pin<&mut Self>,
        cx: &mut Context,
        buf: &mut ReadBuf,
    ) -> Poll<std::io::Result<()>> {
        let stream = self.project().0.as_pin_mut();
        match stream {
            Some(stream) => stream.poll_read(cx, buf),
            None => Poll::Pending,
        }
    }
}

然后我不是很懂需要你说唤醒是怎么回事,感觉你这次序颠倒了。讲到底是future唤醒executor,你完全可以在loop-select里重连上了以后直接Option::insert,下次select的时候就会poll新的stream了。

--
👇
qianjunjushi:

谢谢您的回复,如果是这样那就需要实现future 了 ,那如果重连连上了 pend又要唤醒 ,比较复杂了

作者 qianjunjushi 2021-10-06 09:44

--
👇
johnmave126: 既然tcpstream可能没有,那么就用一个Option。然后你可以加一个函数,或者trait,或者用struct包一下,await这个option的时候,如果是None那就直接返回pending!(),不然的话就await实际的tcpstream。这样就可以放进loop-select了

谢谢您的回复,如果是这样那就需要实现future 了 ,那如果重连连上了 pend又要唤醒 ,比较复杂了

johnmave126 2021-10-06 01:28

既然tcpstream可能没有,那么就用一个Option。然后你可以加一个函数,或者trait,或者用struct包一下,await这个option的时候,如果是None那就直接返回pending!(),不然的话就await实际的tcpstream。这样就可以放进loop-select了

1 共 6 条评论, 1 页