我是一个有用的助手,可以翻译文本。
我正在尝试从一个套接字向另一个套接字发送多个不同的对象(它们是相同的对象类型,只是具有不同的值)。我可以使用以下代码成功地发送一个对象:
客户端:
服务器:
但是,如果我想发送多个消息(将完整的客户端代码放入循环中,而不是调用
客户端会停在
我希望这有意义。有什么指针吗?
我正在尝试从一个套接字向另一个套接字发送多个不同的对象(它们是相同的对象类型,只是具有不同的值)。我可以使用以下代码成功地发送一个对象:
客户端:
var buffer = new byte[1024];
var binFormatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
int bytesRead;
while ((bytesRead = _clientReceive.Receive(buffer)) > 0);
{
ms.Write(buffer, 0, bytesRead);
}
ms.Position = 0;
message = (Message)binFormatter.Deserialize(ms);
}
服务器:
var gm = new Message { Message = "ObjectType", Object = Data };
using (var mem = new MemoryStream())
{
var binFormatter = new BinaryFormatter();
binFormatter.Serialize(mem, gm);
var gmData = mem.ToArray();
client.Send(gmData, gmData.Length, SocketFlags.None);
client.Close();
}
但是,如果我想发送多个消息(将完整的客户端代码放入循环中,而不是调用
client.Close()
),我该如何确定客户端已经接收到完整的对象?像这样将客户端代码放入循环中:while (_isReceivingStarted)
{
var buffer = new byte[1024];
var binFormatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
int bytesRead;
while ((bytesRead = _clientReceive.Receive(buffer)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
ms.Position = 0;
message = (Message) binFormatter.Deserialize(ms);
}
// Do stuff then wait for new message
}
客户端会停在
_clientReceive.Receive(buffer)
,因为它没有接收到来自客户端的Close(),也从未收到0个字节。如果我在服务器上关闭连接,它将循环执行,然后在反序列化MemoryStream时出错,而不是在_clientReceive.Receive(buffer)
处阻塞,等待发送另一个对象。我希望这有意义。有什么指针吗?