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

video.proto:

syntax = "proto3";

package videoservice;

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

message EmptyRequest {}

message VideoResponse {
  bytes videoStream = 1;
}

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

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

Ниже представлен вывод, левая часть - это содержимое буферов на стороне сервера перед переходом в канал gRPC, а правая часть - результат на стороне клиента, у которого ничего нет в каждом блоке: введите описание изображения здесь

1
Ethan Wang 20 Июн 2020 в 10:52

1 ответ

Лучший ответ

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

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

3
Rustam D9RS 20 Июн 2020 в 09:43