一、簡介
Go語言是一門由Google公司開發的編程語言, 具備並發編程, 高性能等特點。其中網路編程是Go語言的核心部分,在網路編程領域,Go語言的gomain庫是一款基於net包和syscall包的高性能網路庫。
gomain庫的主要特點是:基於epoll機制實現,可以處理大量的網路請求,極大提高程序的並發性。此外,gomain還可以進行TCP/UDP網路編程,HTTP/HTTPS網路編程,WebSocket編程等,為開發者提供全面的網路編程解決方案。
二、TCP/UDP網路編程
TCP和UDP是兩種不同的網路傳輸協議,它們分別具有不同的特點。gomain庫可以支持TCP和UDP協議的網路編程,對於不同的協議,gomain提供了一些不同的函數介面。
1、TCP網路編程
對於TCP網路編程,gomain提供了Dialer和Listener這兩個關鍵的介面。其中Dialer用於客戶端與服務端的建立連接,Listener用於服務端的監聽和接收客戶端的請求。
//TCP伺服器實現代碼
package main
import (
"fmt"
"gomail"
"net"
)
func main() {
//監聽埠
listener, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println(err)
return
}
defer listener.Close()
for {
//接收連接
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
continue
}
//處理連接
go handleConn(conn)
}
}
func handleConn(conn net.Conn) {
defer conn.Close()
//循環讀取數據
for {
msg := make([]byte, 1024)
n, err := conn.Read(msg)
if err != nil { //如果出錯連接結束
fmt.Println(err)
return
}
if n == 0 { //如果讀到了EOF,則結束連接
return
}
fmt.Println(string(msg[:n]))
//回寫數據
n, err = conn.Write(msg[:n])
if err != nil { //如果出錯連接結束
fmt.Println(err)
return
}
}
}
//TCP客戶端實現代碼
package main
import (
"fmt"
"net"
)
func main() {
//連接伺服器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
//發送數據
datas := []string{"hello", "world", "!"}
for _, data := range datas {
n, err := conn.Write([]byte(data))
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("send %d byte data: %s\n", n, data)
//讀取數據
resp := make([]byte, 1024)
n, err = conn.Read(resp)
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("recv %d byte data: %s\n", n, resp[:n])
}
}
2、UDP網路編程
對於UDP網路編程,gomain也提供了對應的介面。由於UDP協議中不存在連接的概念,因此gomain的函數介面也與TCP協議略有不同。
//UDP伺服器實現代碼
package main
import (
"fmt"
"net"
)
func main() {
//監聽埠
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
if err != nil {
fmt.Println(err)
return
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
for {
//讀取數據
data := make([]byte, 1024)
n, remoteAddr, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("recv %d byte data: %s from %s\n", n, string(data[:n]), remoteAddr.String())
//回寫數據
n, err = conn.WriteToUDP(data[:n], remoteAddr)
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("send %d byte data: %s to %s\n", n, string(data[:n]), remoteAddr.String())
}
}
//UDP客戶端實現代碼
package main
import (
"fmt"
"net"
)
func main() {
//連接伺服器
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
if err != nil {
fmt.Println(err)
return
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
//發送數據
datas := []string{"hello", "world", "!"}
for _, data := range datas {
n, err := conn.Write([]byte(data))
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("send %d byte data: %s\n", n, data)
//讀取數據
resp := make([]byte, 1024)
n, err = conn.Read(resp)
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("recv %d byte data: %s\n", n, resp[:n])
}
}
三、HTTP/HTTPS網路編程
gomain可以提供HTTP/HTTPS網路編程的能力,為開發者提供了非常方便的Web開發解決方案。
1、HTTP網路編程
gomain實現了http.Handler介面,開發者可以很輕鬆的進行Web應用程序的開發。
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello world!")
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}
2、HTTPS網路編程
HTTPS網路編程相對HTTP更加安全,gomain也提供了對應的介面。實現HTTPS網路編程需要用到證書和密鑰,gomain提供了生成證書和密鑰的函數。
package main
import (
"crypto/tls"
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello https!")
}
func main() {
//生成證書和密鑰
cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
if err != nil {
fmt.Println(err)
return
}
//配置TLS
config := &tls.Config{
Certificates: []tls.Certificate{cert},
}
//創建一個HTTPS伺服器
server := &http.Server{
Addr: ":8000",
Handler: http.HandlerFunc(hello),
TLSConfig: config,
}
//啟動HTTPS伺服器
server.ListenAndServeTLS("", "")
}
四、WebSocket編程
WebSocket是一種基於TCP協議的協議,允許Web應用程序進行全雙工通信,gomain也提供了WebSocket編程的介面。
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{} //創建Upgrader對象
func echo(w http.ResponseWriter, r *http.Request) {
//升級為WebSocket協議
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
//處理請求
for {
//讀取消息
mt, message, err := conn.ReadMessage()
if err != nil {
fmt.Println(err)
break
}
//列印消息
fmt.Printf("recv message: %s\n", string(message))
//回復消息
err = conn.WriteMessage(mt, message)
if err != nil {
fmt.Println(err)
break
}
}
}
func main() {
http.HandleFunc("/echo", echo)
http.ListenAndServe(":8000", nil)
}
五、結語
gomain是一款非常強大的Go語言網路編程庫,它可以實現多種協議的網路編程,為開發者提供了非常方便的解決方案。
原創文章,作者:MGSEU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361686.html
微信掃一掃
支付寶掃一掃