当前位置:首页 > 科技  > 软件

Go 语言高级网络编程

来源: 责编: 时间:2023-11-06 17:18:54 159观看
导读一、简介Go(Golang)中的网络编程具有易用性、强大性和乐趣。本指南深入探讨了网络编程的复杂性,涵盖了协议、TCP/UDP 套接字、并发等方面的内容,并附有详细的注释。二、关键概念1. 网络协议TCP(传输控制协议):确保可靠的数据

一、简介

Go(Golang)中的网络编程具有易用性、强大性和乐趣。本指南深入探讨了网络编程的复杂性,涵盖了协议、TCP/UDP 套接字、并发等方面的内容,并附有详细的注释。pLP28资讯网——每日最新资讯28at.com

pLP28资讯网——每日最新资讯28at.com

二、关键概念

1. 网络协议

  • TCP(传输控制协议):确保可靠的数据传输。
  • UDP(用户数据报协议):更快,但不保证数据传递。

2. 套接字

  • TCP 套接字:用于面向连接的通信。
  • UDP 套接字:用于无连接通信。

3. 并发

  • Goroutines(协程):允许在代码中实现并行处理。
  • Channels(通道):用于协程之间的通信。

三、示例

示例 1:TCP 服务器和客户端

TCP 服务器和客户端示例演示了TCP通信的基础。pLP28资讯网——每日最新资讯28at.com

服务器:pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "fmt")func main() { // Listen on TCP port 8080 on all available unicast and // any unicast IP addresses. listen, err := net.Listen("tcp", ":8080") if err != nil {  fmt.Println(err)  return } defer listen.Close() // Infinite loop to handle incoming connections for {  conn, err := listen.Accept()  if err != nil {   fmt.Println(err)   continue  }  // Launch a new goroutine to handle the connection  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection into the buffer. _, err := conn.Read(buffer) if err != nil {  fmt.Println(err)  return } // Send a response back to the client. conn.Write([]byte("Received: " + string(buffer)))}

客户端:pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "fmt")func main() { // Connect to the server at localhost on port 8080. conn, err := net.Dial("tcp", "localhost:8080") if err != nil {  fmt.Println(err)  return } defer conn.Close() // Send a message to the server. conn.Write([]byte("Hello, server!")) buffer := make([]byte, 1024) // Read the response from the server. conn.Read(buffer) fmt.Println(string(buffer))}

服务器在端口8080上等待连接,读取传入的消息并发送响应。客户端连接到服务器,发送消息并打印服务器的响应。pLP28资讯网——每日最新资讯28at.com

示例 2:UDP 服务器和客户端

与TCP不同,UDP是无连接的。以下是UDP服务器和客户端的实现。pLP28资讯网——每日最新资讯28at.com

服务器:pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "fmt")func main() { // Listen for incoming UDP packets on port 8080. conn, err := net.ListenPacket("udp", ":8080") if err != nil {  fmt.Println(err)  return } defer conn.Close() buffer := make([]byte, 1024) // Read the incoming packet data into the buffer. n, addr, err := conn.ReadFrom(buffer) if err != nil {  fmt.Println(err)  return } fmt.Println("Received: ", string(buffer[:n])) // Write a response to the client's address. conn.WriteTo([]byte("Message received!"), addr)}

客户端:pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "fmt")func main() { // Resolve the server's address. addr, err := net.ResolveUDPAddr("udp", "localhost:8080") if err != nil {  fmt.Println(err)  return } // Dial a connection to the resolved address. conn, err := net.DialUDP("udp", nil, addr) if err != nil {  fmt.Println(err)  return } defer conn.Close() // Write a message to the server. conn.Write([]byte("Hello, server!")) buffer := make([]byte, 1024) // Read the response from the server. conn.Read(buffer) fmt.Println(string(buffer))}

服务器从任何客户端读取消息并发送响应。客户端发送消息并等待响应。pLP28资讯网——每日最新资讯28at.com

示例 3:并发 TCP 服务器

并发允许同时处理多个客户端。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "fmt")func main() { // Listen on TCP port 8080. listener, err := net.Listen("tcp", ":8080") if err != nil {  fmt.Println(err)  return } defer listener.Close() for {  // Accept a connection.  conn, err := listener.Accept()  if err != nil {   fmt.Println(err)   continue  }  // Handle the connection in a new goroutine.  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection. conn.Read(buffer) fmt.Println("Received:", string(buffer)) // Respond to the client. conn.Write([]byte("Message received!"))}

通过为每个连接使用新的 goroutine,多个客户端可以同时连接。pLP28资讯网——每日最新资讯28at.com

示例 4:带有 Gorilla Mux 的 HTTP 服务器

Gorilla Mux 库简化了 HTTP 请求路由。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "fmt" "github.com/gorilla/mux" "net/http")func main() { // Create a new router. r := mux.NewRouter() // Register a handler function for the root path. r.HandleFunc("/", homeHandler) http.ListenAndServe(":8080", r)}func homeHandler(w http.ResponseWriter, r *http.Request) { // Respond with a welcome message. fmt.Fprint(w, "Welcome to Home!")}

这段代码设置了一个 HTTP 服务器,并为根路径定义了一个处理函数。pLP28资讯网——每日最新资讯28at.com

示例 5:HTTPS 服务器

实现 HTTPS 服务器可以确保安全通信。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net/http" "log")func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  // Respond with a message.  w.Write([]byte("Hello, this is an HTTPS server!")) }) // Use the cert.pem and key.pem files to secure the server. log.Fatal(http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil))}

服务器使用 TLS(传输层安全性)来加密通信。pLP28资讯网——每日最新资讯28at.com

示例 6:自定义 TCP 协议

可以使用自定义的 TCP 协议进行专门的通信。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "net" "strings")func main() { // Listen on TCP port 8080. listener, err := net.Listen("tcp", ":8080") if err != nil {  panic(err) } defer listener.Close() for {  // Accept a connection.  conn, err := listener.Accept()  if err != nil {   panic(err)  }  // Handle the connection in a new goroutine.  go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() buffer := make([]byte, 1024) // Read the incoming connection. conn.Read(buffer) // Process custom protocol command. cmd := strings.TrimSpace(string(buffer)) if cmd == "TIME" {  conn.Write([]byte("The current time is: " + time.Now().String())) } else {  conn.Write([]byte("Unknown command")) }}

这段代码实现了一个简单的自定义协议,当客户端发送命令“TIME”时,它会回复当前时间。pLP28资讯网——每日最新资讯28at.com

示例 7:使用 Gorilla WebSocket 进行 WebSockets

WebSockets 提供了通过单一连接的实时全双工通信。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "github.com/gorilla/websocket" "net/http")var upgrader = websocket.Upgrader{ ReadBufferSize:  1024, WriteBufferSize: 1024,}func handler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil {  http.Error(w, "Could not open websocket connection", http.StatusBadRequest)  return } defer conn.Close() for {  messageType, p, err := conn.ReadMessage()  if err != nil {   return  }  // Echo the message back to the client.  conn.WriteMessage(messageType, p) }}func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

WebSocket 服务器会将消息回传给客户端。pLP28资讯网——每日最新资讯28at.com

示例 8:连接超时

可以使用 context 包来管理连接超时。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "context" "fmt" "net" "time")func main() { // Create a context with a timeout of 2 seconds ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() // Dialer using the context dialer := net.Dialer{} conn, err := dialer.DialContext(ctx, "tcp", "localhost:8080") if err != nil {  panic(err) } buffer := make([]byte, 1024) _, err = conn.Read(buffer) if err == nil {  fmt.Println("Received:", string(buffer)) } else {  fmt.Println("Connection error:", err) }}

这段代码为从连接读取数据设置了两秒的截止时间。pLP28资讯网——每日最新资讯28at.com

示例 9:使用 golang.org/x/time/rate 进行速率限制

速率限制控制请求的速率。pLP28资讯网——每日最新资讯28at.com

package mainimport ( "golang.org/x/time/rate" "net/http" "time")// Define a rate limiter allowing two requests per second with a burst capacity of five.var limiter = rate.NewLimiter(2, 5)func handler(w http.ResponseWriter, r *http.Request) { // Check if request is allowed by the rate limiter. if !limiter.Allow() {  http.Error(w, "Too Many Requests", http.StatusTooManyRequests)  return } w.Write([]byte("Welcome!"))}func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

此示例使用速率限制器,将请求速率限制为每秒两个请求,突发容量为五个。pLP28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17249-0.htmlGo 语言高级网络编程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何精确控制 asyncio 中并发运行的多个任务

下一篇: 如何将Docker的构建时间减少40%

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • Automa-通过连接块来自动化你的浏览器

    Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 一年经验在二线城市面试后端的经验分享

    一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
Top