c语言编程笔录

首页 >   > 笔记大全

笔记大全

Go 语言中的网络连接的处理方式有哪些

更新时间:2024-01-24

Go语言网络处理方式

Go语言提供了HTTP标准库,可以用来编写Web应用程序。对于其他传输层协议,需要使用net包和context包中的API进行处理。

TCP连接

Go语言可以处理TCP连接,使用net包中的API。下面的代码示例演示如何创建一个TCP服务器:

    package main

    import (
        "fmt"
        "net"
    )

    func main() {
        listener, err := net.Listen("tcp", ":8000")
        if err != nil {
            fmt.Println("error listening:", err.Error())
            return
        }
        defer listener.Close()
        fmt.Println("listening on :8000")
        for {
            conn, err := listener.Accept()
            if err != nil {
                fmt.Println("error accepting:", err.Error())
                continue
            }
            go handleRequest(conn)
        }
    }

    func handleRequest(conn net.Conn) {
        buf := make([]byte, 1024)
        _, err := conn.Read(buf)
        if err != nil {
            fmt.Println("error reading:", err.Error())
            return
        }
        fmt.Println("received data:", string(buf))
        conn.Write([]byte("got it!"))
    }
  

HTTP连接

Go语言的标准库包含了net/http和http包,可以用于编写Web应用程序。下面的代码演示了如何创建一个HTTP服务器:

    package main

    import (
        "fmt"
        "net/http"
    )

    func main() {
        http.HandleFunc("/", HelloServer)
        err := http.ListenAndServe(":8000", nil)
        if err != nil {
            fmt.Println("ListenAndServe: ", err)
        }
    }

    func HelloServer(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
    }
  

UDP连接

Go语言可以处理UDP连接,使用net包中的API。下面的代码演示如何创建一个UDP服务器:

    package main

    import (
        "fmt"
        "net"
    )

    func main() {
        addr, err := net.ResolveUDPAddr("udp", ":8000")
        if err != nil {
            fmt.Println("error resolving address:", err.Error())
            return
        }
        conn, err := net.ListenUDP("udp", addr)
        if err != nil {
            fmt.Println("error listening:", err.Error())
            return
        }
        defer conn.Close()
        fmt.Println("listening on", addr)
        for {
            handleUDPConnection(conn)
        }
    }

    func handleUDPConnection(conn *net.UDPConn) {
        buffer := make([]byte, 1024)
        n, addr, err := conn.ReadFromUDP(buffer)
        if err != nil {
            fmt.Println("error reading data:", err.Error())
            return
        }
        fmt.Println("received data from", addr, ":", string(buffer[:n]))
        _, err = conn.WriteToUDP([]byte("got it!"), addr)
        if err != nil {
            fmt.Println("error replying:", err.Error())
        }
    }
  

WebSocket连接

Go语言还可以处理WebSocket连接,使用github.com/gorilla/websocket包。下面的代码演示如何创建一个WebSocket服务器:

    package main

    import (
        "fmt"
        "net/http"

        "github.com/gorilla/websocket"
    )

    var upgrader = websocket.Upgrader{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
    }

    func main() {
        http.HandleFunc("/", handleRequest)
        http.ListenAndServe(":8080", nil)
    }

    func handleRequest(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            fmt.Println("upgrade error:", err)
            return
        }
        for {
            messageType, p, err := conn.ReadMessage()
            if err != nil {
                fmt.Println("read error:", err)
                return
            }
            message := string(p)
            fmt.Println("received message:", message)
            err = conn.WriteMessage(messageType, []byte("got it!"))
            if err != nil {
                fmt.Println("reply error:", err)
                return
            }
        }
    }
  

总结

Go语言提供了非常方便的网络编程API,可以轻松地处理TCP、HTTP、UDP和WebSocket连接。Go语言标准库中的net/http和http包是编写Web应用程序最常用的API,而其他传输层协议可以使用net包和各种第三方库进行处理。