尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Go-TCP网络编程深度实战从连接管理到百万并发

Go-TCP网络编程深度实战从连接管理到百万并发 Go-TCP网络编程深度实战从连接管理到百万并发文章导语虽然HTTP是Web开发的主流协议但在游戏服务器、IoT设备通信、金融交易等场景中TCP协议仍然是最优选择。Go的net包提供了简洁而强大的TCP编程接口。本文深入TCP编程的完整实践。一、TCP Server基础架构typeTCPServerstruct{addrstringhandlerfunc(net.Conn)}func(s*TCPServer)Start()error{listener,err:net.Listen(tcp,s.addr)iferr!nil{returnerr}deferlistener.Close()for{conn,err:listener.Accept()iferr!nil{log.Printf(接受连接失败: %v,err)continue}gos.handler(conn)}}// 连接处理funchandleConnection(conn net.Conn){deferconn.Close()// 设置超时conn.SetDeadline(time.Now().Add(30*time.Second))reader:bufio.NewReader(conn)for{msg,err:reader.ReadString(\n)iferr!nil{return}// 处理消息conn.Write([]byte(ACK\n))}}二、TCP粘包处理// 自定义协议Length(4字节) DatafuncEncode(data[]byte)[]byte{buf:make([]byte,4len(data))binary.BigEndian.PutUint32(buf[:4],uint32(len(data)))copy(buf[4:],data)returnbuf}funcDecode(reader io.Reader)([]byte,error){header:make([]byte,4)io.ReadFull(reader,header)length:binary.BigEndian.Uint32(header)data:make([]byte,length)io.ReadFull(reader,data)returndata,nil}三、连接池实现typeConnPoolstruct{mu sync.Mutex connschannet.Conn factoryfunc()(net.Conn,error)}func(p*ConnPool)Get()(net.Conn,error){select{caseconn:-p.conns:returnconn,nildefault:returnp.factory()}}func(p*ConnPool)Put(conn net.Conn){select{casep.conns-conn:default:conn.Close()}}四、全文总结goroutine per connection模型天然适配TCP编程自定义协议解决TCP粘包问题连接池复用TCP连接减少握手开销Deadline设置防止goroutine泄漏参考文献Go net包文档Go Blog - Go Concurrency PatternsTCP/IP详解
返回列表