RPC设计--TcpConnection和TcpServer

TcpConnection

对于服务端来说用来封装clientfd,对于client端来说,就是封装connect函数返回后的fd.

处理此fd上的读写,因此需要为其提供read\write方法,其方法内部调用系统的read\write函数,从fd中读写数据。

当Fd上发生可读事件时,回调TcpConnection::read方法,对于读到的数据将其放入之前提到的TcpBuffer中,

对于写,则是应用层调用写接口,将其写入到TcpBuffer中,当Fd发生可写事件后,调用写方法TcpConnection::write,将TcpBuffer中的数据写到fd中。可分别放入两个TcpBuffer,一个用来读,一个用来写。

考虑读事件发生后,对于server端来说,他需要读取这个请求包,进行反序列化,然后根据请求包内容找到server端注册的RPC方法,进行调用。调用完成后构建响应包,进行序列化,写入TcpBuffer中的写buffer,然后监听可写事件。

同样的,当一个TcpConnection对象创建好后,server端就要监听读事件,但是client端不需要。因为其是主动写的,当写完之后再监听读事件,即server端的响应。

对于client端读事件来说,就是收到了server端的响应,需要反序列化响应包,然后进行相应的回调(client端在RPC请求时可能注册了响应的回调函数,也可能没有)。

由此还需要区分client端和server端,在TcpConnection时传入参数标记。

还需要记录TcpConnection的状态,如CONNECTED CLOSED等。

在可写事件执行完后,需要将其从epoll中删除,等到需要发送数据时才添加写事件,因为fd大部分时候是可写的,就会一直触发可写事件,既然OutBuffer中的数据已经全部写到fd中了,就应该删除该事件。

在可读事件执行完后,不需要将fd的可读事件移出,因为当前这个IO线程本身就是为该通信fd服务的,始终监听fd的可读事件

一旦fd触发可读事件,就调用TcpConnection::read()。

TcpConnection::read:调用系统read读取客户端发来的数据,并写入到InBuffer中。然后调用excute

TcpConnection::excute:从InBuffer中读出所有数据,执行业务逻辑后,将结果写到OutBuffer,等待fd触发可写事件,就调用onWrite

TcpConnection::write:将OutBuffer中的所有数据发送给客户端

TcpServer

TcpServer即服务端,其是对服务端一整套流程的封装,如地址监听(TcpAcceptor)、主Reactor开启(event_loop), 从Reactor开启。

将TcpAcceptor返回的listenFd注册到主Reactor中,设置其回调函数onAccep(), 在OnAccept中选取一个IOThread即从Reactor, 将clientfd放进TcpConnection中.

相关推荐
白狐_7988 小时前
【408计算机网络|第01章|408-CN-01】计算机网络概述与体系结构:性能指标、分层、OSI与TCP/IP
网络协议·tcp/ip·计算机网络
MrDJun8 小时前
长期稳定跑网页监控:TLS 指纹、代理选路与请求节流的工程实践
运维·爬虫·python·网络协议·网站监控
白狐_7988 小时前
【408计算机网络|第03章·上|408-CN-03A】数据链路层(上):组帧、差错控制与可靠传输
网络·网络协议·计算机网络
老赵的博客8 小时前
工控机之udp远程控制
网络·网络协议·udp
怪奇云呼军8 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
努力努力再努力wz8 小时前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
GIS数据转换器9 小时前
智慧灌区管理平台
大数据·服务器·网络·数据库·人工智能·生活
其实防守也摸鱼11 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·运维·网络·人工智能·学习·安全·macos
treesforest19 小时前
平时上网留下的IP地址,到底能被查到什么?
网络·网络协议·tcp/ip·ip地址·ip查询·定位服务
多巴胺梦想家20 小时前
06 代数系统:运算背后的结构之美
网络·拓扑学