简体   繁体   English

如何在 Nodejs 中使用 gRPC 来 stream 字节?

[英]How to stream bytes using gRPC in Nodejs?

New to gRPC, I'm trying to stream a video file using grpc, both client and server are in Node, when running the service, I can console log the buffer on the server side, however I can't get anything from client side, Could anyone help me out, thanks! gRPC 新手,我正在尝试使用 grpc 对视频文件进行 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ,客户端和服务器都在 Node 中,运行服务时,我可以控制台记录服务器端的缓冲区,但是我无法从客户端获取任何内容, 谁能帮帮我,谢谢!

video.proto:视频.proto:

syntax = "proto3";

package videoservice;

service VideoService {
  rpc callVideo (EmptyRequest) returns (stream VideoResponse);
}

message EmptyRequest {}

message VideoResponse {
  bytes videoStream = 1;
}

Implementation in server.js: server.js 中的实现:

var PROTO_PATH = __dirname + '/video.proto';

var fs = require('fs');
var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var videoservice = grpc.loadPackageDefinition(packageDefinition).videoservice;

function callVideo(call) {
    let videoDataStream = fs.createReadStream('./sample.mp4');
    videoDataStream.on('data',function(chunk){
        console.log(chunk);
        call.write(chunk);
    }).on('end',function(){
        call.end();
    })
}

function getServer() {
  var server = new grpc.Server();
  server.addService(videoservice.VideoService.service, {
    callVideo: callVideo
  });
  return server;
}

if (require.main === module) {
  // If this is run as a script, start a server on an unused port
  var videoServer = getServer();
  videoServer.bind('0.0.0.0:9090', grpc.ServerCredentials.createInsecure());
  videoServer.start();
}

exports.getServer = getServer;

and client.js:和client.js:

var PROTO_PATH = __dirname + '/video.proto';

var grpc = require('grpc');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var vs = grpc.loadPackageDefinition(packageDefinition).videoservice;

const REMOTE_URL = "localhost:9090";
let client = new vs.VideoService(REMOTE_URL, grpc.credentials.createInsecure());

client.callVideo({}).on('data',function(chunk){
    console.log(chunk.videoStream);
});

Below is output, the left part is buffers' content in server side before going into gRPC channel, and the right part is the result in client side which has nothing in each chunk:下面是 output,左边是进入 gRPC 通道之前服务器端的缓冲区内容,右边是客户端的结果,每个块中没有任何内容: 在此处输入图像描述

This will help solve your problem:这将有助于解决您的问题:

function callVideo(call) {
    const videoDataStream = fs.createReadStream('./sample.mp4');

    videoDataStream.on('data', (chunk) => {
        console.log(chunk);
        call.write({ videoStream: chunk });
    });
    
    videoDataStream.on('end', () => {
        call.end();
    });
}

Do not pay attention to changing the style of the code.不要注意改变代码的样式。 The main thing here is call.write({videoStream: chunk});这里的主要内容是call.write({videoStream: chunk}); . .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM