
Go语言网络编程与Socket通信网络编程是构建分布式系统的基础。本文将深入探讨Go语言中的网络编程和Socket通信帮助你构建高性能的网络应用。一、网络编程概述Go语言提供了强大的网络编程支持主要包括TCP/UDP协议传输层协议HTTP/HTTPS应用层协议WebSocket双向通信协议gRPC高性能RPC框架二、TCP编程2.1 TCP服务器package main import ( bufio fmt net os ) func handleConnection(conn net.Conn) { defer conn.Close() fmt.Printf(New connection from %s\n, conn.RemoteAddr()) scanner : bufio.NewScanner(conn) for scanner.Scan() { message : scanner.Text() fmt.Printf(Received from %s: %s\n, conn.RemoteAddr(), message) if message quit { fmt.Printf(Connection closed by %s\n, conn.RemoteAddr()) return } response : fmt.Sprintf(Echo: %s\n, message) conn.Write([]byte(response)) } } func main() { listener, err : net.Listen(tcp, :8080) if err ! nil { fmt.Printf(Failed to listen: %v\n, err) os.Exit(1) } defer listener.Close() fmt.Println(TCP server listening on :8080) for { conn, err : listener.Accept() if err ! nil { fmt.Printf(Failed to accept: %v\n, err) continue } go handleConnection(conn) } }2.2 TCP客户端func main() { conn, err : net.Dial(tcp, localhost:8080) if err ! nil { fmt.Printf(Failed to connect: %v\n, err) os.Exit(1) } defer conn.Close() scanner : bufio.NewScanner(os.Stdin) for { fmt.Print(Enter message: ) scanner.Scan() message : scanner.Text() _, err : conn.Write([]byte(message \n)) if err ! nil { fmt.Printf(Failed to send: %v\n, err) return } if message quit { fmt.Println(Disconnecting...) return } buf : make([]byte, 1024) n, err : conn.Read(buf) if err ! nil { fmt.Printf(Failed to read: %v\n, err) return } fmt.Printf(Server response: %s, string(buf[:n])) } }三、UDP编程3.1 UDP服务器func main() { addr, err : net.ResolveUDPAddr(udp, :8080) if err ! nil { fmt.Printf(Failed to resolve address: %v\n, err) os.Exit(1) } conn, err : net.ListenUDP(udp, addr) if err ! nil { fmt.Printf(Failed to listen: %v\n, err) os.Exit(1) } defer conn.Close() fmt.Println(UDP server listening on :8080) buf : make([]byte, 1024) for { n, clientAddr, err : conn.ReadFromUDP(buf) if err ! nil { fmt.Printf(Failed to read: %v\n, err) continue } message : string(buf[:n]) fmt.Printf(Received from %s: %s\n, clientAddr, message) response : fmt.Sprintf(Echo: %s, message) _, err conn.WriteToUDP([]byte(response), clientAddr) if err ! nil { fmt.Printf(Failed to send: %v\n, err) } } }3.2 UDP客户端func main() { serverAddr, err : net.ResolveUDPAddr(udp, localhost:8080) if err ! nil { fmt.Printf(Failed to resolve address: %v\n, err) os.Exit(1) } conn, err : net.DialUDP(udp, nil, serverAddr) if err ! nil { fmt.Printf(Failed to connect: %v\n, err) os.Exit(1) } defer conn.Close() scanner : bufio.NewScanner(os.Stdin) for { fmt.Print(Enter message: ) scanner.Scan() message : scanner.Text() _, err : conn.Write([]byte(message)) if err ! nil { fmt.Printf(Failed to send: %v\n, err) return } if message quit { fmt.Println(Disconnecting...) return } buf : make([]byte, 1024) n, _, err : conn.ReadFromUDP(buf) if err ! nil { fmt.Printf(Failed to read: %v\n, err) return } fmt.Printf(Server response: %s\n, string(buf[:n])) } }四、HTTP编程4.1 HTTP服务器func helloHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set(Content-Type, text/plain) w.WriteHeader(http.StatusOK) w.Write([]byte(Hello, World!)) } func main() { http.HandleFunc(/hello, helloHandler) server : http.Server{ Addr: :8080, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 20, } fmt.Println(HTTP server listening on :8080) log.Fatal(server.ListenAndServe()) }4.2 HTTP客户端func main() { resp, err : http.Get(http://localhost:8080/hello) if err ! nil { fmt.Printf(Failed to get: %v\n, err) os.Exit(1) } defer resp.Body.Close() body, err : ioutil.ReadAll(resp.Body) if err ! nil { fmt.Printf(Failed to read body: %v\n, err) os.Exit(1) } fmt.Printf(Response status: %s\n, resp.Status) fmt.Printf(Response body: %s\n, body) }五、WebSocket编程5.1 WebSocket服务器import ( fmt net/http github.com/gorilla/websocket ) var upgrader websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err : upgrader.Upgrade(w, r, nil) if err ! nil { fmt.Printf(Failed to upgrade: %v\n, err) return } defer conn.Close() fmt.Println(WebSocket connection established) for { messageType, p, err : conn.ReadMessage() if err ! nil { fmt.Printf(Failed to read: %v\n, err) break } fmt.Printf(Received: %s\n, p) err conn.WriteMessage(messageType, p) if err ! nil { fmt.Printf(Failed to write: %v\n, err) break } } } func main() { http.HandleFunc(/ws, wsHandler) fmt.Println(WebSocket server listening on :8080) log.Fatal(http.ListenAndServe(:8080, nil)) }5.2 WebSocket客户端func main() { conn, _, err : websocket.DefaultDialer.Dial(ws://localhost:8080/ws, nil) if err ! nil { fmt.Printf(Failed to dial: %v\n, err) os.Exit(1) } defer conn.Close() // 发送消息 err conn.WriteMessage(websocket.TextMessage, []byte(Hello, WebSocket!)) if err ! nil { fmt.Printf(Failed to write: %v\n, err) return } // 接收消息 _, message, err : conn.ReadMessage() if err ! nil { fmt.Printf(Failed to read: %v\n, err) return } fmt.Printf(Received: %s\n, message) }六、gRPC编程6.1 定义Protobufsyntax proto3; package greeter; service Greeter { rpc SayHello(HelloRequest) returns (HelloReply); } message HelloRequest { string name 1; } message HelloReply { string message 1; }6.2 gRPC服务器type server struct { pb.UnimplementedGreeterServer } func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return pb.HelloReply{Message: Hello in.Name}, nil } func main() { lis, err : net.Listen(tcp, :50051) if err ! nil { log.Fatalf(Failed to listen: %v, err) } s : grpc.NewServer() pb.RegisterGreeterServer(s, server{}) fmt.Println(gRPC server listening on :50051) if err : s.Serve(lis); err ! nil { log.Fatalf(Failed to serve: %v, err) } }6.3 gRPC客户端func main() { conn, err : grpc.Dial(localhost:50051, grpc.WithInsecure()) if err ! nil { log.Fatalf(Failed to dial: %v, err) } defer conn.Close() client : pb.NewGreeterClient(conn) ctx, cancel : context.WithTimeout(context.Background(), time.Second) defer cancel() resp, err : client.SayHello(ctx, pb.HelloRequest{Name: World}) if err ! nil { log.Fatalf(Failed to call SayHello: %v, err) } fmt.Printf(Response: %s\n, resp.Message) }七、总结本文介绍了Go语言网络编程的核心技术TCP编程面向连接的可靠传输UDP编程无连接的快速传输HTTP编程Web应用开发WebSocket编程双向实时通信gRPC编程高性能RPC框架Go语言的net包提供了简洁而强大的网络编程接口结合goroutine可以轻松构建高性能的网络服务。