同时支持websocket和socket的框架

本文介绍了如何改造一个仅支持socket的框架,使其同时支持websocket和socket协议。通过封装不同的协议处理过程,实现了协议的插件式注册,便于扩展其他长连接协议。文章提供了代码实现,包括定义的接口以及websocket协议对象的详细说明。
摘要由CSDN通过智能技术生成

前言:

通过之前的几篇文章我们详细的介绍到了一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值