如何封装一个服务器的网络库

10 篇文章 0 订阅
7 篇文章 0 订阅

为什么需要封装

  • 隐藏TCP数据黏连
  • 隐藏TCP参数(超时时间,连接等待时间)
  • 方便支持高级功能(心跳,重连,统计,加密,压缩,错误日志)
  • 让对象关系更加明确(而不是一个Socket打遍天下无敌手)

绝对不应该封装的内容

  • 序列化,这不应该归网络库来管,很容易把两者耦合起来,设计时必须要考虑
  • 服务器架构网络的代码。比如,服务器组之间的数据通信,用来建立起服务器网络的握手或是服务器组内部的消息转发,属于比较底层的代码范畴,但不应该放到网络层来做这些。
  • 周边的工具类,比如记录日志,统计性能数据等。推荐用delegate函数来注册的方式进行工作,而不是之间在底层附带一个功能类。

理想的状态

网络模块启动起来后,不需要再和网络对象打交道,对上层而言,感觉只是在处理收发包。

一个网络对象应该集成写数据和发送数据的功能,对于服务器和客户端差异化的代码应该很少(listen, accept, connect),剩余的功能应该完全一致。

如果希望关注一些事件(OnConnected,DataSent),以事件的形式暴露。上层可以注册这些事件来完成一些自定义的功能,比如断线重连,网络吞吐量统计等等。

实际用到的类

代码写的比较烂,就把几个主要类的功能说一下

MySocket

Socket的封装类。有数据包缓冲的功能(存储一块缓冲空间byte[]),另外就是存储SocketId(看项目需要),Ip(记录日志用)。

ServerNetwork

类似于TcpListener,包含Listen、Accept等服务器专用的逻辑。Hold住了一个MySocket(用于Listen),并维护住连上的客户端列表(List<MySocket>)。处理客户端的连上,断开,以及流数据到包的切换。

ClientNetwork

类似于TCPConnector,包含连接(Connect)的逻辑。此外,和上面的ServerNetwork有重复的功能。处理客户端的连上,断开,以及流数据到包的切换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值