Как вы десериализуете сообщения protobuf в С#, читая их в массив байтов через сокеты?

Я новичок в буферах как С#, так и протокола, и пытаюсь отправить простое сообщение из python в программу С#. Пока у меня не получается. Из python я отправляю следующее:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverAddress = ('localhost', 2211)
sock.bind(serverAddress)
sock.listen(1)
connection, clientAddress = sock.accept()

message = protos.testproto_pb2.Coordinate()
message.Row = 12.3
message.Col = 12.4
connection.sendall(message.SerializeToString())

connection.close()

В С# я подключаюсь к сокету и получаю данные в массив байтов:

Byte[] bytesReceived;
var server = (ip:"127.0.0.1", port: 2211);

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(server.ip), server.port);
Socket mySocket = 
    new Socket(serverEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Coordinate Coord = new Coordinate{Row = 0, Col = 0};

mySocket.Connect(serverEndPoint);

bytes = mySocket.Receive(bytesReceived, bytesReceived.Length, 0);

Coord = Coordinate.Parser.ParseFrom(bytesReceived);

Мой *.proto — это очень простое сообщение с двумя поплавками:

message Coordinate{
    //coordinates
    float Row = 1;
    float Col = 2;
}

Я пробовал разные вещи, что приводило к различным ошибкам. Когда я не обрезаю байт, удаляя нулевые байты, я получаю Google.Protobuf.dll: 'Protocol message contained an invalid tag (zero).'. Затем я попытался прочитать только те байты, которые содержат данные, и получил: Google.Protobuf.dll: 'While parsing a protocol message, the input ended unexpectedly in the middle of a field.

Я также попробовал некоторые другие функции protobuf, например. Coord.MergeFrom() и т.д... но пока безуспешно. Может ли кто-нибудь сообщить мне, что я делаю неправильно?

Я мог бы быть либо с простыми сокетами, либо с десериализацией protobuf.


person SchillerFalke2    schedule 14.12.2019    source источник
comment
comment
Убедитесь, что полное сообщение получено на стороне c#. Как правило, вам нужно будет использовать формирование сообщений, чтобы убедиться, что вы получили полное сообщение, прежде чем пытаться его десериализовать.   -  person dbc    schedule 14.12.2019
comment
@dbc спасибо за комментарии! Я посмотрю на структуру сообщения. Я не думаю, что это источник ошибок, так как в моем простом примере я уверен, что получаю все сообщение, но проблема в том, что я получаю больше данных в массиве байтов, чем я хочу.   -  person SchillerFalke2    schedule 16.12.2019