golang网关(2)-- 端口监听

221 阅读1分钟

扯两句

golang 就是网络开发的C语言

忘了从哪里看到的这句话了,还是蛮贴切的,golang的runtime和官方包里面封装了很多底层的东西(比如说:epoll等),到了应用层,一般只需要考虑业务。

当然了,也能自己去实现更高效的底层网络事件(应该是阿里有大牛在什么比赛上面,自己实现epoll事务处理,在某些场景下,是比官方默认的效率高很多)

鉴于源码无法全部分开,只是在此处贴一小部分,谢谢理解

封装listener

coreListener.go (model)

// CoreListener TCP链接对象的封装
type CoreListener struct {
	listener  net.Listener
	lock      sync.RWMutex
	status    bool
	network   string
	address   string
	startTime time.Time
}

// NewCoreListener 新建对象
func NewCoreListener(network string, address string) *CoreListener {
	return &CoreListener{
		status:  false,
		network: network,
		address: address,
	}
}

// IsRuning 是否在监听中
func (cl *CoreListener) IsRuning() bool {
	return cl.status
}

// Start 开启服务
func (cl *CoreListener) Start() error {
	cl.lock.Lock()
	defer cl.lock.Unlock()
	if cl.IsRuning() {
		return fmt.Errorf("服务已经启动")
	}

	var err error
	/*
        // 判断是否是在WIN下,启动的方式不一样  2020-03
        // 可以只考虑在linux下,本机用docker调试  2020-04
		if utilprocess.IsWIN() {
			cl.listener, err = net.Listen(cl.network, cl.address)
		} else {
			f := os.NewFile(3, "")
			cl.listener, err = net.FileListener(f)
		}
	*/
	cl.listener, err = net.Listen(cl.network, cl.address)
	if err == nil {
		cl.startTime = time.Now()
		cl.status = true
	}
	logs.ExitedProcess(err, "start tcp error")
	return err
}

tcp.go

// StartCoreTCPServer 核心TCP服务,监听端口,方便硬件连接
func StartCoreTCPServer() {
	// 2S 之后才启动SOCKET服务
	time.Sleep(time.Second * 2)

	err := coreListener.Start()
	if logs.ErrorProcess(err, "tcp start error") {
		return
	}

	logs.Show("start tcp service @%s", port)

	// 启动心跳检查
	// 关闭默认心跳。2022-04-22
	base.Go(heartBeatJob)

启动

main.go

func main() {
// ...其他省略
	base.Go(core.StartCoreTCPServer)
	base.Go(core.StartWebServer)
// ...其他省略