前言:
通过之前的几篇文章我们详细的介绍到了一个socket框架应该怎么架构,需要些什么模块,可是美中不足的就是它只支持最简单的socket协议,不能够满足实际生产情况,于是我便对此框架进行了改造,让它能够同时支持websocket 和 socket ,而且插件式 注册,当需要别的长连接协议的时,完全可以自己定制。已经把所有代码整合了,希望给个星星支持一下 microSocket。
实现基础:
一切编程皆socket ,这话有点说的绝对。但是仔细想想,确实也就是那么回事,网络通信现在99%都是socket吧。我们有n多种协议,但是都是socket的,所以这些协议无非就是 握手 解包 封包 上面不同 ,那我们把这些 过程 单独封装 不就能够 写一个框架能够随意切换 协议了么!
代码实现:
废话不多说 我们直接看代码 !
type SocketTypes interface{
ConnHandle(msf *Msf,sess *Session)
Pack(data []byte)[]byte
}
我们定义了一个接口 必须实现两个 函数
- .ConnHandle 函数 传入一个session 对象 其实就是一个 socket握手成功的句柄,我们在这个函数里面死循环不断地读取 句柄 的数据 并且 解包 处理粘包 和 解析数据 并 路由
- . Pack 函数 负责把要发送的数据 打包成指定协议的 数据包
如此一来我们 server 代码便 非常的 整洁
func NewMsf(msfEvent MsfEventer,socketType SocketTypes) *Msf {
msf := &Msf{
EventPool: NewRouterMap(),
MsfEvent: msfEvent,
SocketType :socketType,
}
msf.SessionMaster = NewSessonM(msf)
return msf
}
func (this *Msf) Listening(address string) {
tcpListen, err := net.Listen("tcp", address)
if err != nil {
panic(err)
}
go this.SessionMaster.HeartBeat(2)
fd := uint32(0)
for {
conn, err := tcpListen.Accept()
if err != nil {
log.Println(err)
continue
}
//调用握手事件
if this.MsfEvent.OnHandel(fd, conn) == false {
continue
}
sess := NewSession(fd, conn)
this.SessionMaster.SetSession(fd, sess)
fd++
//调用相应协议的处理函数
go this.SocketType.ConnHandle