【问题标题】:Transmitting strings between a C# client and a Node server在 C# 客户端和 Node 服务器之间传输字符串
【发布时间】:2023-03-09 16:20:01
【问题描述】:

我有一个节点 TCP 服务器正在工作并等待数据以及我拥有的每个套接字

socket.on("data", function () {

});

现在,据我了解,只要收到任何数据,就会调用它。这意味着如果我发送一个大字符串,它将被分割成多个数据包,每个数据包将分别调用事件。因此,我可以连接数据,直到调用“结束”事件。根据节点文档,这发生在发送 FIN 数据包时。

我不得不承认我对网络不太了解,但是这个 FIN 数据包,我在从我的 C# 应用程序发送数据时是否必须手动发送它,或者这个代码

var stream = client.GetStream();
using (var writer = new StreamWriter(stream)) writer.Write(request);

当它设法发送整个请求字符串时自动发送它? 其次,它是如何从另一端工作的?如何从 Node 向我的 C# 客户端发送“批次”数据,以便它知道整个“批次”应该被视为一件事,尽管它位于多个数据包中?

此外,即使在 .NET 中,是否也存在“结束”的等价物?目前,我一直在阻塞,直到流的 DataAvailable 为真,但这会在第一个数据包上触发,对吧?它不会等待整个事情。

如果有人可以为我阐明这一点,我将不胜感激。

【问题讨论】:

    标签: c# node.js networking tcp


    【解决方案1】:

    当你在C#中调用writer.Close()时会发送TCPFIN数据包,这将触发Node中的end事件。

    没有看到您的 C# 阅读代码看起来如何,我无法提供具体信息,但是当 Node 关闭连接时,C# 不会触发事件。它将不再是stream.CanRead,如果您当前有一个stream.Read 调用阻塞,它将引发异常。

    TCP 提供字节流,仅此而已。如果您计划从 Node 和 C# 来回发送多条消息,则由您决定以可以将它们分开的方式发送消息。例如,您可以在每条消息前面加上长度,这样您就可以读取一个字节,然后在该消息之后读取那么多字节。如果您的消息始终是文本,您可以将其编码为 JSON 并用换行符分隔消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多