问题标签 [networkstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7631 浏览

c# - 如何在单元测试中起订量网络流?

我使用 Moq & NUnit 作为单元测试框架。

我编写了一个将 NetworkStream 对象作为参数的方法:

现在我正在考虑为这种方法重写我的单元测试,因为之前编写的测试依赖于真实的 NetworkStream 对象并且不是很好处理。

如何模拟 NetworkStream?如前所述,我正在使用起订量。有可能吗?如果不是,我该如何解决这个问题?

期待您的反馈!

这是 以前的解决方案:

更新:

我再次重写了我的课程。使用以前的解决方案进行单元测试很顺利,但现实世界的应用程序示例向我展示了为什么我不可能使用将Stream对象传递到我的方法中的(否则很好)建议。

首先,我的应用程序依赖于一个恒定的 TCP 连接。如果您使用Stream.Read(这是可能的)并且没有数据可以接收,它将阻止执行。如果您指定超时,如果没有接收到数据,则会引发异常。对于我需要的(相当简单的)应用程序,这种行为是不可接受的。我只需要一个简洁、持续的 TCP 连接。因此,拥有该NetworkStream.DataAvailable属性对我的实施至关重要。

目前的解决方案:

我最终为 NetworkStream 编写了一个接口和一个包装器。我还最终将临时接收缓冲区的字节数组传递给该方法。单元测试它现在工作得很好。

这是我使用的单元测试:

0 投票
1 回答
566 浏览

.net - 使用 .NET 进行 TCP 编程

我遇到了套接字编程工作的问题。我编写了一个通过套接字/网络流发送命令的 TCP 客户端。我正在使用Wireshark查看通过电线的原始数据。每次我发送“命令”(意味着我 Flush() 网络流)时,Wireshark 应用程序都会告诉我 TCP 标头中的校验和不正确(说“它应该是 0x2440,但是是 0x0000)。我确实收到了 ACK .我不明白为什么在应用程序层我必须关心 TCP 标头。这是不对的。有人知道我为什么会收到这个“错误”。有没有我不知道的设置? 我正在使用带有 Tcp 的 .NET 2.0 套接字。谢谢。

0 投票
5 回答
4348 浏览

c# - C# NetworkStream.Read 奇怪

谁能指出这段代码的缺陷?我正在使用 TcpClient 检索一些 HTML。与 IIS 服务器通信时,NetworkStream.Read() 似乎永远不会完成。如果我改用 Fiddler 代理,它可以正常工作,但是当直接与目标服务器对话时,.read() 循环不会退出,直到连接异常出现“远程服务器已关闭连接”之类的错误。

更新

在调试器中,我可以看到整个响应立即通过并附加到我的 StringBuilder(响应)中。当服务器完成发送响应或我的代码没有检测到它时,似乎连接没有关闭。

结论 正如这里所说的,最好利用协议的提供(在 HTTP 的情况下,Content-Length 标头)来确定事务何时完成。但是,我发现并非所有页面都设置了内容长度。所以,我现在使用混合解决方案:

  1. 对于所有事务,将请求的Connection标头设置为“关闭”,以阻止服务器保持套接字打开。这提高了服务器在响应您的请求时关闭连接的机会。

  2. 如果Content-Length已设置,则使用它来确定请求何时完成。

  3. 否则,将 NetworkStream 的 RequestTimeout 属性设置为一个较大但合理的值,例如 1 秒。然后,循环NetworkStream.Read()直到 a) 发生超时,或者 b) 您读取的字节数少于您要求的字节数。

感谢大家出色而详细的回复。

0 投票
4 回答
7630 浏览

c# - C#:实现 NetworkStream.Peek?

目前,C# 中没有NetworkStream.Peek方法。实现这种方法的最佳方法是什么,NetworkStream.ReadByte除了返回byte的实际上没有从Stream?

0 投票
2 回答
3524 浏览

c# - GZipStream,如何正确读取 GZipStream

我有一些我用 C# 编写的代码

然后我在这一行有一个异常 InvalidDataException int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);

GZip 标头幻数不正确。

有任何想法吗?

0 投票
2 回答
162 浏览

.net - .Net 使用 Chr() 解析文本

我正在构建一个简单的客户端-服务器聊天系统。

客户端向服务器发送数据,服务器将数据重新发送给所有其他客户端。我正在使用 TcpListener 和 Network 流类在客户端和服务器之间发送数据。

我需要发送的字段是,例如:名称、文本、时间戳等。我使用 ASCII 字符 29 将它们分开。

我还使用 ASCII 字符 30 来标记流数据的结束。

数据采用 UTF8 编码。

这是一个好方法吗?我会遇到问题吗?有没有更好的方法?

更新:

可能我的问题被误解了,所以我解释得更好。假设有一个从客户端发送到服务器的数据列表,并且假设只在一个流中发送所有数据,你如何发送这些数据?

  • 使用标记
  • 使用字符作为分隔符
  • 为每个字段使用固定长度
0 投票
2 回答
370 浏览

c# - 即使我只关心它的流,我是否必须存储 TcpClient ?

TcpClient 的新实例连接到远程主机。它的 NetworkStream 被检索和存储。我是否还必须存储 TcpClient 本身以确保它不会被垃圾收集?

如果您要回答“您必须存储它才能处理它”:在我的具体情况下,TcpClient 通常会存在很长时间(应用程序生命周期),因此处理它并不是必须的。但是,我同意,一般来说,它必须被存储才能调用 Dispose。

0 投票
3 回答
1809 浏览

c# - 我如何判断 NetWorkStream 何时完成使用 .net TcpClient 进行通信

我尝试使用stream.DataAvailable来判断它是否完成,但有时该值是假的,但过了一会儿又是真的,我必须设置一个计数器并通过符号'>'判断结束像这样

有什么好的方法来处理吗?谢谢!

0 投票
2 回答
189 浏览

c# - Trouble with StreamReader

Alright so here is what I have so far,

Unfortunately when my IRC dummy enters a room with a password set it writes out the password, if I make it change channel with a command such as #lol test

test being the password, since CHANNEL = s; it writes out the password with the command

That is the only way to write out to IRC so is there a way for the "CHANNEL" to only be the start of the text and just #lol so it doesn't write out the password?

I hope you understand my problem.

0 投票
1 回答
6581 浏览

c# - TcpClient BeginRead/Send 线程安全吗?

如果我在关联的网络流上TcpClient调用了异步,则使用 .NET我仍然可以在另一个线程上调用该流吗?BeginRead()Write()

还是我必须lock()TcpClient从 回调BeginRead的代码和发送的代码中?

另外,如果我关闭TcpClient

我也必须这样lock()TcpClient吗?