I've just had another look in the docs, and there *isn't* a flush missing 
as it happens - but the reason is slightly subtle.

Your code manually creates a CodedOutputStream and writes to it without 
flushing.
The documentation sample creates a FileStream and calls the 
IMessage.WriteTo(Stream) extension method - which *does* flush.

So you could change your code to just use:

message.WriteTo(stream)

instead - remove all mention of CodedOutputStream in your code.

That said, making all of this simpler in cases where you *are* using 
CodedOutputStream feels like a good idea. I've got a pull request which 
wouldn't actually fix your current code, but which makes it easier to use a 
CodedOutputStream with a using statement.

Jon

On Friday, 26 February 2016 12:58:16 UTC, Jon Skeet wrote:
>
> Hi Stephen,
>
> It's quite possible that all you're missing is a cod.Flush() call in the 
> sending code.
> Looking at the documentation, I think we're missing the flush call there 
> too, which suggests it's far too easy to do.
> I've raised https://github.com/google/protobuf/issues/1282 to make sure 
> we don't miss this.
>
> Jon
>
> On Thursday, 25 February 2016 17:41:35 UTC, Stephen LABBE wrote:
>>
>> Hi,
>>
>> I try to code a sample about protocol buffer over tcp.
>> I launch a TCPListener and a TCPClient.
>>
>> I send with the TCP client and CodedOutputStream a message with some 
>> parameters.
>>
>> But when I try to decode the message with CodedInputStream, I just have 
>> the first parameter of my message.
>> And the EmbeddedMessage is null
>>
>> Could you explain to me how to decode the entire message ?
>>
>> This is my listener code :
>> public static void ListenerProto(string ip, int port) {
>>             TcpListener server = null;
>>             try {
>>                 Console.WriteLine();
>>
>>                 IPAddress localAddr = IPAddress.Parse(ip);
>>
>>                 // TcpListener server = new TcpListener(port);
>>                 server = new TcpListener(localAddr, port);
>>
>>                 // Start listening for client requests.
>>                 server.Start();
>>
>>                 // Buffer for reading data
>>                 byte[] bytes = new byte[10000];
>>
>>                 // Enter the listening loop.
>>                 while (true) {
>>                     Console.WriteLine("Waiting for a connection... ");
>>
>>                     // Perform a blocking call to accept requests.
>>                     // You could also user server.AcceptSocket() here.
>>                     TcpClient client = server.AcceptTcpClient();
>>                     Console.WriteLine("Connected!");
>>
>>                     // Get a stream object for reading and writing
>>                     NetworkStream stream = client.GetStream();
>>
>>                     CodedInputStream cod = new CodedInputStream(stream);
>>                  
>>                     var tcpMessage = TCPMessage.Parser.ParseFrom(cod);
>>
>>                     // Shutdown and end connection
>>                     client.Close();
>>                 }
>>             }
>>             catch (SocketException e) {
>>                 Console.WriteLine($"SocketException: {e}");
>>             }
>>             finally {
>>                 // Stop listening for new clients.
>>                 server?.Stop();
>>             }
>>         }
>>
>> This is my send code
>> public static void ClientProto(string ipServer, int port, TCPMessage 
>> message) {
>>             try {
>>                 // Create a TcpClient.
>>                 // Note, for this client to work you need to have a 
>> TcpServer 
>>                 // connected to the same address as specified by the 
>> server, port
>>                 // combination.
>>                 TcpClient client = new TcpClient(ipServer, port);
>>
>>                 //Create stream
>>                 var stream = client.GetStream();
>>
>>                 //Create Coded output stream to send data over the tcp 
>> client
>>                 CodedOutputStream cod = new CodedOutputStream(stream);
>>
>>                 // Send the message to the connected TcpServer. 
>>                 //message.WriteTo(stream);
>>                 var calculateSize = message.CalculateSize();
>>
>>                 message.WriteTo(cod);
>>
>>                 //Write message in tb
>>                 Console.WriteLine($"Sent: {message}");
>>
>>                 // Close everything.
>>                 stream.Close();
>>                 client.Close();
>>             }
>>             catch (ArgumentNullException e) {
>>                 Console.WriteLine($"ArgumentNullException: {e}");
>>             }
>>             catch (SocketException e) {
>>                 Console.WriteLine($"SocketException: {e}");
>>             }
>>         }
>>
>> And finaly that is my proto message (simplify):
>> syntax = "proto3";
>>
>> message TCPMessage {
>> enum Type {
>> Add = 0;
>> Remove = 1;
>> Select = 2;
>> Update = 3;
>> }
>> message Parameter {
>> string name = 1;
>> string value = 2;
>> }
>> message EmbeddedMessage {
>> string id = 1;
>> Type type = 2;
>> repeated Parameter parameters = 3;
>> }
>> Type commande = 1;
>> EmbeddedMessage type = 2;
>> }
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to