Go语言net包支持TCP/UDP/HTTP网络编程,通过Listen/Accept处理并发连接,Dial实现客户端通信,UDP适用于低延迟场景,手动解析HTTP请求可定制协议,需设置超时与错误处理保障稳定性。

Go语言的
net
包为网络编程提供了强大且简洁的支持,适合快速构建TCP、UDP和HTTP等网络服务。通过标准库即可完成常见网络通信任务,无需引入第三方依赖。下面介绍使用
net
包进行基础网络编程的核心实践。
TCP服务器与客户端通信
使用
net.Listen
创建TCP服务器,监听指定地址和端口。每当有客户端连接时,通过
Accept
方法获取连接对象,并在独立goroutine中处理数据读写。
示例:简单回声服务器
服务器代码:
package mainimport ("bufio""fmt""net""strings")
func handleConn(conn net.Conn) {defer conn.Close()scanner := bufio.NewScanner(conn)for scanner.Scan() {line := strings.TrimSpace(scanner.Text())fmt.Fprintf(conn, "echo: %sn", line)}}
func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {panic(err)}defer listener.Close()
fmt.Println("Server running on :8080")for { conn, err := listener.Accept() if err != nil { continue } go handleConn(conn)}
}
客户端代码:
立即学习“go语言免费学习笔记(深入)”;
package mainimport ("bufio""fmt""net""os")
func main() {conn, err := net.Dial("tcp", "localhost:8080")if err != nil {panic(err)}defer conn.Close()
go func() { scanner := bufio.NewScanner(conn) for scanner.Scan() { fmt.Println(scanner.Text()) }}()input := bufio.NewScanner(os.Stdin)for input.Scan() { fmt.Fprintln(conn, input.Text())}
}
运行服务器后,启动客户端,输入任意文本,服务端会返回带"echo:"前缀的内容。这种模式适用于聊天系统或协议调试工具。
UDP数据报通信
UDP是无连接协议,适合低延迟场景如音视频传输或心跳检测。使用
net.ListenPacket
监听UDP端口,通过
ReadFrom
接收数据并获取发送方地址,再用
WriteTo
回应。
示例:UDP回声服务
服务器:
package mainimport ("fmt""net")
func main() {addr, := net.ResolveUDPAddr("udp", ":9000")conn, := net.ListenUDP("udp", addr)defer conn.Close()
buf := make([]byte, 1024)for { n, clientAddr, _ := conn.ReadFrom(buf) go func() { response := append([]byte("echo: "), buf[:n]...) conn.WriteTo(response, clientAddr) }()}
}
客户端:
package mainimport ("fmt""net")
func main() {conn, _ := net.Dial("udp", "localhost:9000")defer conn.Close()
fmt.Fprint(conn, "hello udp")buf := make([]byte, 1024)n, _ := conn.Read(buf)fmt.Printf("received: %sn", buf[:n])
}
UDP通信不需要维持连接状态,资源开销小,但不保证送达,需根据业务权衡使用。
基础HTTP服务实现
虽然
net/http
更常用,但
net
可手动解析HTTP请求。适用于学习协议原理或定制轻量协议处理。
简易HTTP响应示例:
package mainimport ("io""net""strings")
func handleHTTP(conn net.Conn) {defer conn.Close()req := make([]byte, 1024)io.ReadFull(conn, req)
if strings.HasPrefix(string(req), "GET / ") { response := "HTTP/1.1 200 OKrnContent-Length: 13rnrnHello World!" conn.Write([]byte(response))} else { conn.Write([]byte("HTTP/1.1 404 Not Foundrnrn"))}
}
func main() {listener, := net.Listen("tcp", ":8000")for {conn, := listener.Accept()go handleHTTP(conn)}}
访问
http://localhost:8000
将收到"Hello World!"。实际项目推荐使用
net/http
,此处仅展示底层交互过程。
连接超时与错误处理
生产环境需设置读写超时防止资源耗尽。使用
SetDeadline
设定绝对时间限制。
添加超时控制:
func handleConn(conn net.Conn) { defer conn.Close() // 设置10秒内必须完成读写 conn.SetDeadline(time.Now().Add(10 * time.Second))scanner := bufio.NewScanner(conn)for scanner.Scan() { if strings.ToLower(scanner.Text()) == "quit" { break } fmt.Fprintf(conn, "recv: %sn", scanner.Text()) conn.SetDeadline(time.Now().Add(10 * time.Second)) // 重置超时}
}
同时应检查网络错误类型,区分临时错误与永久断开,合理重试或关闭连接。
基本上就这些。掌握
net
包的基础用法后,可以构建可靠的网络服务。关键是理解连接生命周期、并发处理和异常恢复机制。后续可结合
context
包实现优雅关闭,或封装通用通信框架。
以上就是Golang使用net进行基础网络编程实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1407470.html
微信扫一扫
支付宝扫一扫