加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#在同一个Socket上发送多个对象

发布时间:2020-12-16 01:43:07 所属栏目:百科 来源:网络整理
导读:我正在尝试从一个套接字向另一个套接字发送多个不同的对象(好吧,它们是相同的对象类型,只是具有不同的值).我可以使用以下代码发送一个对象: 客户: var buffer = new byte[1024];var binFormatter = new BinaryFormatter();using (var ms = new MemoryStrea
我正在尝试从一个套接字向另一个套接字发送多个不同的对象(好吧,它们是相同的对象类型,只是具有不同的值).我可以使用以下代码发送一个对象:

客户:

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,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,bytesRead);
        }
        ms.Position = 0;
        message = (Message) binFormatter.Deserialize(ms);
    }
    // Do stuff then wait for new message
}

客户端将挂起_clientReceive.Receive(缓冲区),因为它没有从客户端收到Close()并且永远不会获得0个接收的字节.如果我关闭服务器上的连接,它将循环,然后在Deserialize MemoryStream中出错,而不是在the_clientReceive.Receive(缓冲区)阻塞,以预期发送另一个对象.

我希望这是有道理的.有什么指针吗?

解决方法

您可以发送一条头消息,通知接收端需要多少字节.这类似于HTTP中的Content-Length指令.其他选项,制作一个你最后发送的自定义终止字符串(显然它不会在序列化对象的二进制有效负载中的任何位置出现,这就是为什么前一个解决方案就是我要做的).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读