服务器主动推送

1.客户端轮询:ajax定时拉取
2.服务端主动推送:webSocket
全双工的,本质是一个额外的tcp连接,建立和关闭时握手使用的http协议,其他数据传输不使用
http协议更加复杂一些,适用于需要进行复杂双向数据通讯的场景
3.服务端主动推送:sse (server send event)
html5新标准,用来从服务端实时推送数据到浏览器端
直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议
简单的服务器数据推送场景,使用服务器推送事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 gRPC服务器主动推送数据,可以使用服务器端流式 RPC(Server Streaming RPC)来实现。在 gRPC 中,服务器端流式 RPC 允许服务器在单个请求中流式传输多个响应消息给客户端。 以下是一个简单的示例代码,展示了如何在 gRPC服务器主动推送数据给客户端: 服务定义(.proto 文件): ```protobufsyntax = "proto3"; service MyService { rpc PushData(DataRequest) returns (stream DataResponse) {} } message DataRequest { // 可选的请求字段} message DataResponse { string data =1; } ``` 服务器端实现(使用 gRPC 的 Go语言示例): ```gopackage mainimport ( "context" "log" "net" "google.golang.org/grpc" ) type myServer struct{} func (s *myServer) PushData(req *pb.DataRequest, stream pb.MyService_PushDataServer) error { // 在这里可以根据需要生成响应数据,并通过流式发送给客户端 for i :=0; i <10; i++ { resp := &pb.DataResponse{ Data: "Data " + strconv.Itoa(i), } if err := stream.Send(resp); err != nil { return err } } return nil} func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterMyServiceServer(s, &myServer{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } ``` 客户端实现(使用 gRPC 的 Go语言示例): ```gopackage mainimport ( "context" "log" "google.golang.org/grpc" ) func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewMyServiceClient(conn) req := &pb.DataRequest{} stream, err := client.PushData(context.Background(), req) if err != nil { log.Fatalf("error calling PushData: %v", err) } for { resp, err := stream.Recv() if err == io.EOF { break } if err != nil { log.Fatalf("error receiving response: %v", err) } log.Printf("Received data: %s", resp.Data) } } ``` 上述示例中,服务器端实现了 `PushData` 方法,该方法返回一个 `stream DataResponse`,在方法内部通过循环向客户端发送多个响应消息。客户端通过调用 `PushData` 方法获取到一个 `stream DataResponse`,然后通过循环调用 `Recv` 方法来接收服务器端发送的多个响应消息。 这样,服务器就可以主动推送数据给客户端了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值