我有一个节点TCP服务器正在工作并等待数据和我拥有的每个套接字
socket.on("data", function () {
});
现在,据我所知,只要收到任何数据,就会调用此方法。这意味着如果我发送一个大字符串,它将被分段为多个数据包,每个数据包将分别调用该事件。因此,我可以连接数据,直到调用“结束”事件。根据Node文档,这会在发送FIN数据包时发生。
我不得不承认我对网络知之甚少但是这个FIN数据包,我必须在从我的C#app发送数据时手动发送它还是这个代码
var stream = client.GetStream();
using (var writer = new StreamWriter(stream)) writer.Write(request);
当它设法发送整个请求字符串时自动发送它? 其次,它如何从另一端起作用?如何从Node发送“批量”数据到我的C#客户端,以便它知道整个“批处理”应该被认为是一件事,尽管它在多个数据包中?
另外,即使在.NET中,是否有相当于“结束”的东西?目前,我阻塞直到流的DataAvailable为true,但是会在第一个数据包上触发,对吧?它不会等待整个事情。
如果有人能为我阐明这一点,我会很感激。
答案 0 :(得分:1)
当您在C#中调用FIN
时,将发送TCP writer.Close()
数据包,这会在end
中触发Node
事件。
在没有看到你的C#阅读代码如何看起来我无法给出具体细节,但是当Node关闭连接时,C#不会触发事件。它将不再是stream.CanRead
,如果您有一个当前stream.Read
来电阻止,则会引发异常。
TCP提供了一个字节流,仅此而已。如果您计划从Node和C#来回发送多条消息,则由您自己发送消息以便将它们分开。例如,您可以为每条消息添加长度前缀,以便您读取一个字节,然后在消息之后读取多个字节。如果您的邮件始终是文字,则可以将其编码为JSON
,并使用换行符分隔邮件。