0

我有一个节点 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 为真,但这会在第一个数据包上触发,对吧?它不会等待整个事情。

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

4

1 回答 1

1

当您在 C# 中FIN调用时,将发送TCP数据包,这将触发您所说的事件。writer.Close()endNode

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

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

于 2013-08-04T22:27:54.080 回答