Как передавать байты с использованием gRP C в Nodejs? - PullRequest
0 голосов
/ 20 июня 2020

Новое в gRP C, я пытаюсь транслировать видеофайл с помощью grp c, и клиент, и сервер находятся в узле, при запуске службы я могу консоль регистрировать буфер на стороне сервера, однако Я ничего не могу получить со стороны клиента. Может ли кто-нибудь мне помочь, спасибо!

video.proto:

syntax = "proto3";

package videoservice;

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

message EmptyRequest {}

message VideoResponse {
  bytes videoStream = 1;
}

Реализация на сервере. 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;

и клиент. 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);
});

Ниже вывод, левая часть - буферы 'содержимое на стороне сервера перед переходом в канал gRP C, а правая часть - это результат на стороне клиента, у которого ничего нет в каждом фрагменте: enter image description here

1 Ответ

2 голосов
/ 20 июня 2020

Это поможет решить вашу проблему:

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();
    });
}

Не обращайте внимания на изменение стиля кода. Здесь главное call.write({videoStream: chunk});.

...