【问题标题】:Sending data from list of items c#从项目列表发送数据c#
【发布时间】:2013-01-31 18:08:45
【问题描述】:

我有一个列表,其中包含我试图发送到我的服务器的大量消息。 这是我的代码:

    private void sendBtn_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < listORequestedCommands.Items.Count; i++)
        {
            clientSock.Send(Encoding.Default.GetBytes(listORequestedCommands.Items[i].ToString()));
        }
        removeAll_Click(sender, e);
        sendBtn.Enabled = false;
    }

但是,当我单击发送按钮时,我看到服务器收到一条消息,其中包含所有串联的列表项,而不是接收分开的消息。

有什么想法吗?

【问题讨论】:

  • clientSock是什么类型?
  • 分隔如何?在每条消息之后发送 NewLine 或其他任何内容。

标签: c# list sockets client-server


【解决方案1】:

实施协议。 TCP 套接字是基于流的,而不是基于消息的。

【讨论】:

  • Idanis,CodeCaster 的意思是 TCP 不尊重消息边界。分别发送 4 个字节 1200 次相当于一次调用发送 4800 个字节(到接收端)。您将不得不添加某种语法(即实现协议)来解析和分隔您的消息。一个基本示例是为每条消息添加一个 4 字节整数长度的前缀,以便您知道消息的结束位置和下一条消息的开始位置。
  • 为大家解答。 clientSockSocket。 Jason 和 CodeCaster,我不明白的是:当我单击发送时,有一条消息正在发送,然后,在仍然连接的同时,我只是用一条新消息替换该消息,仍然有一条消息,然后单击再次发送,新消息正在再次正确发送。这与我所做的有什么不同?
  • @Idanis 这个问题经常被问到,如果我有时间我会尝试查找或为此创建一个参考问题/社区维基。底线:一侧的send() 不会导致另一侧的receive()。这是由 Nagle 算法引起的,但简单地禁用它并不能解决您的问题。如果您在每条消息前加上 4 个字节(Int32int)描述消息长度,则服务器可以先读取长度 N,然后再读取 N 个字节。
  • 尝试搜索您所说的解决方案。
【解决方案2】:

您应该等待确认,因为您不等待字节被收集并显示为合并结果。 将数据发送到套接字后,您应该使用类似

的代码
int bytesRec = clientSock.Receive(bytes);

关注此网址http://msdn.microsoft.com/en-us/library/bew39x2a.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2017-04-13
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2021-04-15
    • 2014-05-22
    相关资源
    最近更新 更多