Я новичок в буферах как С#, так и протокола, и пытаюсь отправить простое сообщение из 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.
SerializeToString()
на стороне python? ... неважно,SerializeToString()
: сериализует сообщение и возвращает его как строка. Обратите внимание, что байты являются двоичными, а не текстовыми; мы используем тип str только как удобный контейнер.. - person dbc   schedule 14.12.2019