问题标签 [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.
c# - 如何在单元测试中起订量网络流?
我使用 Moq & NUnit 作为单元测试框架。
我编写了一个将 NetworkStream 对象作为参数的方法:
现在我正在考虑为这种方法重写我的单元测试,因为之前编写的测试依赖于真实的 NetworkStream 对象并且不是很好处理。
如何模拟 NetworkStream?如前所述,我正在使用起订量。有可能吗?如果不是,我该如何解决这个问题?
期待您的反馈!
这是 以前的解决方案:
更新:
我再次重写了我的课程。使用以前的解决方案进行单元测试很顺利,但现实世界的应用程序示例向我展示了为什么我不可能使用将Stream
对象传递到我的方法中的(否则很好)建议。
首先,我的应用程序依赖于一个恒定的 TCP 连接。如果您使用Stream.Read
(这是可能的)并且没有数据可以接收,它将阻止执行。如果您指定超时,如果没有接收到数据,则会引发异常。对于我需要的(相当简单的)应用程序,这种行为是不可接受的。我只需要一个简洁、持续的 TCP 连接。因此,拥有该NetworkStream.DataAvailable
属性对我的实施至关重要。
目前的解决方案:
我最终为 NetworkStream 编写了一个接口和一个包装器。我还最终将临时接收缓冲区的字节数组传递给该方法。单元测试它现在工作得很好。
这是我使用的单元测试:
.net - 使用 .NET 进行 TCP 编程
我遇到了套接字编程工作的问题。我编写了一个通过套接字/网络流发送命令的 TCP 客户端。我正在使用Wireshark查看通过电线的原始数据。每次我发送“命令”(意味着我 Flush() 网络流)时,Wireshark 应用程序都会告诉我 TCP 标头中的校验和不正确(说“它应该是 0x2440,但是是 0x0000)。我确实收到了 ACK .我不明白为什么在应用程序层我必须关心 TCP 标头。这是不对的。有人知道我为什么会收到这个“错误”。有没有我不知道的设置? 我正在使用带有 Tcp 的 .NET 2.0 套接字。谢谢。
c# - C# NetworkStream.Read 奇怪
谁能指出这段代码的缺陷?我正在使用 TcpClient 检索一些 HTML。与 IIS 服务器通信时,NetworkStream.Read() 似乎永远不会完成。如果我改用 Fiddler 代理,它可以正常工作,但是当直接与目标服务器对话时,.read() 循环不会退出,直到连接异常出现“远程服务器已关闭连接”之类的错误。
更新
在调试器中,我可以看到整个响应立即通过并附加到我的 StringBuilder(响应)中。当服务器完成发送响应或我的代码没有检测到它时,似乎连接没有关闭。
结论 正如这里所说的,最好利用协议的提供(在 HTTP 的情况下,Content-Length 标头)来确定事务何时完成。但是,我发现并非所有页面都设置了内容长度。所以,我现在使用混合解决方案:
对于所有事务,将请求的
Connection
标头设置为“关闭”,以阻止服务器保持套接字打开。这提高了服务器在响应您的请求时关闭连接的机会。如果
Content-Length
已设置,则使用它来确定请求何时完成。否则,将 NetworkStream 的 RequestTimeout 属性设置为一个较大但合理的值,例如 1 秒。然后,循环
NetworkStream.Read()
直到 a) 发生超时,或者 b) 您读取的字节数少于您要求的字节数。
感谢大家出色而详细的回复。
c# - C#:实现 NetworkStream.Peek?
目前,C# 中没有NetworkStream.Peek
方法。实现这种方法的最佳方法是什么,NetworkStream.ReadByte
除了返回byte
的实际上没有从Stream
?
c# - GZipStream,如何正确读取 GZipStream
我有一些我用 C# 编写的代码
然后我在这一行有一个异常 InvalidDataException int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
GZip 标头幻数不正确。
有任何想法吗?
.net - .Net 使用 Chr() 解析文本
我正在构建一个简单的客户端-服务器聊天系统。
客户端向服务器发送数据,服务器将数据重新发送给所有其他客户端。我正在使用 TcpListener 和 Network 流类在客户端和服务器之间发送数据。
我需要发送的字段是,例如:名称、文本、时间戳等。我使用 ASCII 字符 29 将它们分开。
我还使用 ASCII 字符 30 来标记流数据的结束。
数据采用 UTF8 编码。
这是一个好方法吗?我会遇到问题吗?有没有更好的方法?
更新:
可能我的问题被误解了,所以我解释得更好。假设有一个从客户端发送到服务器的数据列表,并且假设只在一个流中发送所有数据,你如何发送这些数据?
- 使用标记
- 使用字符作为分隔符
- 为每个字段使用固定长度
c# - 即使我只关心它的流,我是否必须存储 TcpClient ?
TcpClient 的新实例连接到远程主机。它的 NetworkStream 被检索和存储。我是否还必须存储 TcpClient 本身以确保它不会被垃圾收集?
如果您要回答“您必须存储它才能处理它”:在我的具体情况下,TcpClient 通常会存在很长时间(应用程序生命周期),因此处理它并不是必须的。但是,我同意,一般来说,它必须被存储才能调用 Dispose。
c# - 我如何判断 NetWorkStream 何时完成使用 .net TcpClient 进行通信
我尝试使用stream.DataAvailable来判断它是否完成,但有时该值是假的,但过了一会儿又是真的,我必须设置一个计数器并通过符号'>'判断结束像这样
有什么好的方法来处理吗?谢谢!
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.
c# - TcpClient BeginRead/Send 线程安全吗?
如果我在关联的网络流上TcpClient
调用了异步,则使用 .NET我仍然可以在另一个线程上调用该流吗?BeginRead()
Write()
还是我必须lock()
在TcpClient
从 回调BeginRead
的代码和发送的代码中?
另外,如果我关闭TcpClient
:
我也必须这样lock()
做TcpClient
吗?