我想通过套接字连接发送对象列表。我知道WCF服务将是一个更好的选择,但它不是我的选择。
我正在使用此代码发送数据
private void tm_Tick(object sender, EventArgs e)
{
XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));
MemoryStream stream = new MemoryStream(1024);
formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);
byte[] bt = stream.ToArray();
foreach (Communication.Client Client in server.ClientList)
{
Client.SendMessage(bt);
}
stream.Flush();
}
public void SendMessage(Byte[] bytesSent)
{
SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
socket.SendAsync(writeEventArgs);
}
似乎工作正常。
接收数据我正在线程上使用此代码。
void ReceiveData()
{
try
{
while (true)
{
if (disposed == true)
return;
data = new byte[socket.ReceiveBufferSize];
var recv = socket.Receive(data);
XmlSerializer formatter = new XmlSerializer(typeof(List<Object.PIP>));
MemoryStream stream = new MemoryStream(data);
**Classes.TickerInformation.PIPList= (List<Object.PIP>)formatter.Deserialize(stream);**
}
socket.Close();
return;
}
catch (Exception ex)
{
}
}
我遇到异常XML文档中存在错误(170,46)。在这一行: Classes.TickerInformation.PIPList =(List)formatter.Deserialize(stream);
我认为所有数据都没有收到,所以这种情况正在发生。
答案 0 :(得分:2)
问题是你没有收到整个XML直到最后 - 所以你只序列化XML的初始部分。你必须从套接字读取,直到没有数据。
我建议设置客户端发送的终结符字符串,以便您查找它已完全收到该消息。
请记住,套接字不是基于请求 - 响应。您打开套接字并继续阅读。