我发送的消息基本上是从服务器到客户端的xml对象(SerializedXMLMessageObject)序列化的。
在尝试反序列化之前,我正在尝试读取整个消息并将其累积到MemoryStream中。 我遇到的问题是它永远不会进入下面的“其他”部分。 当它完成阅读后,它会跳到else语句的结尾处。
两个问题:
如何从套接字读取整个邮件并保持与服务器的连接? 有没有一种简单的方法来修复下面的代码,还是我必须提供某种分隔符?
在哪里可以找到通过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();
}
}
答案 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);
}