如何从套接字读取整个消息来重建对象?

时间:2013-05-10 20:11:25

标签: c# sockets

我发送的消息基本上是从服务器到客户端的xml对象(SerializedXMLMessageObject)序列化的。

在尝试反序列化之前,我正在尝试读取整个消息并将其累积到MemoryStream中。 我遇到的问题是它永远不会进入下面的“其他”部分。 当它完成阅读后,它会跳到else语句的结尾处。

两个问题:

  1. 如何从套接字读取整个邮件并保持与服务器的连接? 有没有一种简单的方法来修复下面的代码,还是我必须提供某种分隔符?

  2. 在哪里可以找到通过C#中的套接字发送xml序列化对象的示例? 我遇到的每个例子都展示了如何发送一个简单的字符串。

  3. 编辑1:期望连接保持打开状态。即客户端保持与服务器的连接。

    private void callback(IAsyncResult result)
     {
       byte[] data = (byte[])result.AsyncState;
    
                try
                {
                    int read = socket.EndReceive(result);
    
                    if (read > 0)
                    {
                        _memoryStream.Write(data, 0, read);
                        socket.BeginReceive(data, 0, 255, SocketFlags.None, new AsyncCallback(callback), data);
                    }
    
                    else
                    {
                        SerializedXMLMessageObject msg = DeserializeFromXml<SerializedXMLMessageObject >(_memoryStream.ToArray());
    
                    }             
    
                }
                catch (ObjectDisposedException)
                {
                    socket.Close();
                }
            }
    

1 个答案:

答案 0 :(得分:1)

接受建议并意识到自己的问题。

从发送方我计算要发送的邮件大小:

 byte[] data = ObjectToByteArray(SerializedXMLMessageObject);
 byte[] head = BitConverter.GetBytes(data.Length);
 byte[] total = new byte[data.Length + head.Length];
 head.CopyTo(total, 0);
 data.CopyTo(total, head.Length);

socket.Send(...)

在接收端,我将其转换为StateObject,提取消息大小并读取直到它完成。

stateObject.TotalMessageSize = BitConverter.ToInt32(stateObject.buffer, 0);

...

 if (state.received < state.expected)           
 {
  handler.BeginReceive(state.buffer, 0, StateObject.bufferSize,
                            SocketFlags.None, callback, stateobject);
 }