栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

2022-03-08 使用go快速创建tcp服务器

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-03-08 使用go快速创建tcp服务器

目录

摘要:

核心函数:

创建监听listen:

等待新连接accept:

读取数据并处理:


摘要:

记录使用go快速创建tcp服务器

核心函数:

创建监听listen:

func (s *Service) ProxyServiceOpen() error {
	s.Logger.Info("Open ProxyServiceOpen ready")

	bindAddress := g_localIp + ":" + g_proxyPort
	ln, err := net.Listen("tcp", bindAddress)
	if err != nil {
		s.Logger.Error(fmt.Sprintf("Open Server net.Listen fail, err = %v", err))
		return fmt.Errorf("ProxyServiceOpen listen fail, err = %v", err)
	}

	s.Listener = ln

	go s.ProxyServiceServe()

	s.Logger.Info(fmt.Sprintf("ProxyServiceOpen net.Listen ok, proxyAddr = %s", bindAddress))
	return nil
}

等待新连接accept:

func (s *Service) ProxyServiceServe() {
	for {
		conn, err := s.Listener.Accept()
		if err, ok := err.(interface {
			Temporary() bool
		}); ok && err.Temporary() {
			continue
		}

		if nil != err {
			s.Logger.Error(fmt.Sprintf("ProxyServiceServe fail, Listener.Accept = %v", err))
			continue
		}

		go s.ProxyServiceHandle(conn)
	}
}

读取数据并处理:
func (s *Service) ProxyServiceHandle(conn net.Conn) {
	defer conn.Close()

	for {
		b, err := io.ReadAll(conn)
		if nil != err {
			s.Logger.Error(fmt.Sprintf("ProxyServiceHandle fail, io.ReadFull err = %v", err))
			return
		}

		byteLen := len(b)
		if 0 == byteLen {
			s.Logger.Info(fmt.Sprintf("ProxyServiceHandle ignore, 0 == byteLen"))
			return
		}

		byte_apply := b[1:]
		s.Logger.Info(fmt.Sprintf("ProxyServiceHandle ready ApplyByte, byteLen = %d", byteLen))

		err = s.ProxyServiceProcessByte(byte_apply)
		if nil != err {
			s.Logger.Error(fmt.Sprintf("ProxyServiceHandle fail, ProxyServiceProcessByte err = %v", err))
			continue
		}
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904575.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号