0

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

我正在尝试阅读整个消息并将其累积到 MemoryStream 中,然后才能对其进行反序列化。我遇到的问题是它永远不会进入下面这个 if-else 的“else”部分。读完后,它会跳到 else 语句的末尾括号。

两个问题:

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

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

编辑 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();
            }
        }
4

1 回答 1

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);
 }
于 2013-05-10T21:28:36.927 回答