Как вы, наверное, заметили, protobuf - это в основном фреймворк для сериализации / десериализации данных в / из двоичной формы. Если вы хотите передать эти данные, вы, конечно, можете отправить их в потоковом режиме - в конце концов, это всего лишь байты.
Вы можете написать свой собственный сетевой протокол, но, вероятно, вам нужно что-то вроде gRPC (ссылка на учебник по C # - выведена из ваших тегов). gRPC позволяет осуществлять потоковую передачу - вы можете узнать больше об этом здесь . Быстрая цитата:
Сервер потоковой передачи RPC Сервер потоковой передачи RPC похож на наш простой
Например, кроме того, сервер отправляет обратно поток ответов после
получение сообщения запроса клиента. После отправки обратно все его
ответы, сведения о состоянии сервера (код состояния и необязательно
сообщение о состоянии) и дополнительные конечные метаданные отправляются обратно
завершить на стороне сервера. Клиент завершает, как только у него есть все
ответы сервера.
Клиентский потоковый RPC Клиентский потоковый RPC также похож на наш
простой пример, за исключением того, что клиент отправляет поток запросов
сервер вместо одного запроса. Сервер отправляет обратно один
ответ, как правило, но не обязательно после того, как он получил все
запросы клиента, а также сведения о его статусе и дополнительный трейлинг
метаданные.
Также, для быстрого примера, посетите эту страницу . Пример с сайта gRPC:
public override async Task<RouteSummary> RecordRoute(Grpc.Core.IAsyncStreamReader<Point> requestStream,
Grpc.Core.ServerCallContext context)
{
int pointCount = 0;
int featureCount = 0;
int distance = 0;
Point previous = null;
var stopwatch = new Stopwatch();
stopwatch.Start();
while (await requestStream.MoveNext())
{
var point = requestStream.Current;
pointCount++;
if (CheckFeature(point).Exists())
{
featureCount++;
}
if (previous != null)
{
distance += (int) previous.GetDistance(point);
}
previous = point;
}
stopwatch.Stop();
return new RouteSummary
{
PointCount = pointCount,
FeatureCount = featureCount,
Distance = distance,
ElapsedTime = (int)(stopwatch.ElapsedMilliseconds / 1000)
};
}
EDIT
Пример прото-файла с определениями gRPC.
syntax = "proto3";
message DataRow {
// Your data row here
}
message SendDataResponse {
}
service DataAcceptor {
// Send multiple rows in a streaming scenario
rpc SendData (stream DataRow) returns (SendDataResponse) {}
}