Home >Backend Development >Golang >How does Go WebSocket work with other protocols?
Go WebSocket works with other protocols, including: HTTP/HTTPS: WebSocket typically runs on top of HTTP/HTTPS, with the WebSocket protocol negotiated through a handshake process. gRPC: gRPC is an RPC framework that integrates with WebSocket to make low-latency, high-throughput RPC calls between clients and servers.
WebSocket is a protocol for full-duplex communication between a client and a server. It is commonly used to build real-time applications such as chat, messaging, and games. WebSocket can be used in a wide range of scenarios with other protocols such as HTTP, HTTPS, gRPC and WebSockets.
WebSocket typically runs on top of HTTP or HTTPS. When a client establishes a WebSocket connection to the server, it first sends an HTTP request containing a special header called "Upgrade" with its value set to "websocket". The server responds to this request with an "Upgrade" header whose value is also set to "websocket". This handshake process enables the client and server to negotiate the use of the WebSocket protocol and establish a full-duplex communication channel over HTTP/HTTPS.
import ( "fmt" "log" "net/http" "github.com/gorilla/websocket" ) const ( port = ":8080" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc("/", indexHandler) http.HandleFunc("/ws", websocketHandler) log.Printf("Listening on port %s", port) if err := http.ListenAndServe(port, nil); err != nil { log.Fatal(err) } } func indexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Welcome to the WebSocket page.") } func websocketHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal(err) } defer conn.Close() for { mt, message, err := conn.ReadMessage() if err != nil { log.Println(err) conn.Close() break } if err := conn.WriteMessage(mt, message); err != nil { log.Println(err) conn.Close() break } } }
gRPC is a high-performance remote procedure call (RPC) framework that can be used with WebSocket. The client uses gRPC functions to call server-side methods, and the server-side method uses WebSocket to send responses. This integration allows applications to handle RPC calls in a low-latency, high-throughput manner.
import ( "context" "fmt" "log" "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/gorilla/websocket" "google.golang.org/protobuf/proto" ) const ( port = ":8080" grpcAddr = ":50051" ) var upgrader = websocket.Upgrader{} var mux *runtime.ServeMux func main() { mux = runtime.NewServeMux() grpcConn, err := grpc.DialContext( context.Background(), grpcAddr, grpc.WithInsecure(), ) if err != nil { log.Fatal(err) } // 注册 gRPC 服务到网关。 if err := helloworldpb.RegisterGreeterHandler(context.Background(), mux, grpcConn); err != nil { log.Fatal(err) } http.HandleFunc("/", indexHandler) http.HandleFunc("/grpc-ws", websocketHandler) log.Printf("Listening on port %s", port) if err := http.ListenAndServe(port, nil); err != nil { log.Fatal(err) } } func indexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Welcome to the gRPC-WebSocket page.") } func websocketHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal(err) } defer conn.Close() for { mt, message, err := conn.ReadMessage() if err != nil { log.Println(err) conn.Close() break } req := &helloworldpb.HelloRequest{} if err := proto.Unmarshal(message, req); err != nil { log.Println(err) conn.Close() break } ctx := context.Background() resp, err := helloworldpb.NewGreeterClient(grpcConn).SayHello(ctx, req) if err != nil { log.Println(err) conn.Close() break } message, err := proto.Marshal(resp) if err != nil { log.Println(err) conn.Close() break } if err := conn.WriteMessage(mt, message); err != nil { log.Println(err) conn.Close() break } } }
The above is the detailed content of How does Go WebSocket work with other protocols?. For more information, please follow other related articles on the PHP Chinese website!