问题标签 [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 投票
1 回答
379 浏览

c# - 如何对从 NetworkStream 派生的类进行单元测试?

作为项目的一部分,我有一个派生自 NetworkStream 的类。在这种情况下,它提供了诸如 Read 和 ReadByte 等方法的包装实现,以提供一些特定于上下文的安全性(它使用一些额外的逻辑调用基本方法)。

但测试这是一个问题。该类在构造函数中需要一个 Socket(具体类型)和对我不起作用的模拟(在这里使用 Moq,也许像 TypeMock 这样的东西,但我想避免昂贵的工具)。

另一种选择可能是组合而不是继承,并创建一个包装 NetworkStream 并实现我自己的类似于 NetworkStream 的接口的类。但这也是一个问题。BCL 中的大多数流消费者(例如 StreamReader 等)需要具体的 Stream 或派生类型,因此不适用于我的组合类。

那么,任何人都可以想到任何替代方案吗?如果没有像样的报道就离开,我不会感到高兴 - 这是一个可能出现很多问题的领域,它应该是稳固的。

0 投票
6 回答
3858 浏览

c# - .NET 阻塞套接字读取直到 X 字节可用?

假设我通过 TCP 实现了简单的协议,其中每条消息由以下部分组成:

  1. int指示数据长度。
  2. 二进制数据,长度在 1 中指定。

阅读这样的消息,我想要类似的内容:

使用Socket.ReceiveNetworkStream.Read读取可用的字节数。我希望ReadBytes阻止调用,直到length字节可用。

有没有一种简单的方法可以做到这一点,而不必循环读取,在等待剩余数据的偏移处重新开始?

在实际应用程序中,读取可能应该在异步或后台线程上完成,但我暂时忽略了这一点。重要的是能够在所有数据可用之前不完成读取。

编辑

我知道我可以自己缓冲数据,而且我知道该怎么做。这只是一个循环Receive,在下一个偏移处继续。我要问的是是否有这样的循环的可重用实现,而不需要任何类型的自己的循环(或者当所有数据可用时完成的可重用异步实现)。

0 投票
1 回答
608 浏览

c# - When to use different ports for client-server application?

When will I normally need different ports for client-server communication? (This question is for C# and general socket programming).

I have implemented and been using a simple C# client-server application. Basically:

  • server listens for client
  • on accepted/connected
  • server spawn client thread -
  • server waits for client to talk
  • client talk
  • server respond
  • client talk
  • server respond etc.

if client stops talking, then server blocks in NetworkStream.Read() mode forever in that spawned thread unless client-side disconnects.

I am now thinking of the situation where both sides keeps quiet until some event happen on either side then only will the client or server sends data across. As such both needs to be in NetworkStream.Read mode concurrently somehow and also be able to send to each other at the same time (if the event happens on both sides simultaneously).

Do we need different ports in this case or can both client and server be in NetworkStream.BeginRead mode without risking a problem with NetworkStream being in both writing and sending mode at the same time?

Thanks.

0 投票
4 回答
14434 浏览

c# - c# NetworkStream write() 和 read()

我想知道如何停止Networkstream.Read()阻塞线程。我有单独的线程NetworkStream.Read()正在等待来自服务器的数据。假设用户按下某个按钮将一些数据发送到服务器。NetworkStream.Write()但是当有NetworkStream.Read()其他线程在等待数据时,我无法调用。NetworkStream我每次都可以锁定,但NetworkStream.Read()会阻塞线程,所以在读取至少 1 个字节之前我不能发送数据。

0 投票
4 回答
12042 浏览

c# - NetworkStream.Read 会挂起/阻塞的一些原因是什么?

MSDN 文档似乎暗示 NetworkStream.Read 总是会立即返回。如果未找到数据,则返回 0。但是,我有一些当前部署的代码,仅在某些情况下(我还没有弄清楚哪些情况),NetworkStream.Read 似乎挂起。这是我能够从转储文件中收集的堆栈跟踪

我注意到 NetworkStrea.Read 实际上调用了 Socket.Receive,据我所知,这可能是阻塞的。我只是不知道为什么有时它会阻塞,有时它不会。

0 投票
2 回答
1009 浏览

ios - iOS:如何从缓冲区或字符串中删除空字符?

我正在尝试在 iOS 中与从网络流中获得的字符串进行字符串比较。

读取流的代码是:

另一端的服务器总是产生 1024 字节的响应,其中 chr(0) 被放置在数据的末尾以填充缓冲区。

当我进行字符串比较时:

我总是得到否定的结果,大概是因为字符串包含响应和大量空字符。

在将响应读入字符串时,我希望能够从缓冲区中删除空字符,但我在 iOS 中没有任何运气。

帮助表示赞赏!

谢谢。

戴夫

0 投票
1 回答
6694 浏览

c# - 在 C# 中调用 BeginRead() 后关闭 NetworkStream

我已经实现了一个模拟串行端口的 DataReceived 事件的系统,通过使用 BeginRead() 方法触发从 TCPClient 对象的 NetworkStream 读取数据,如下所示:

它从另一个线程调用以下方法:

这似乎工作正常。我可以毫无问题地向网络上的设备发送和接收数据。但是,当我尝试使用以下方法断开连接时,程序崩溃:

它抛出以下错误:

我也尝试过如下实现断开连接的方法:

但这会导致以下错误:

我认为这与已调用 BeginRead() 方法而未调用 EndRead() 方法这一事实有关。如果是这种情况,我怎样才能在不崩溃的情况下关闭流?

0 投票
1 回答
2677 浏览

c# - C# 使用 NetworkStream 进行异步读写

我已经构建了一个服务器,它接收来自客户端的请求并给出取决于请求类型的响应。如果请求类型是流式传输,则服务器必须发送数据数组。在服务器的流式传输数据时,客户端可能会发送停止请求以停止流式传输。如果请求和响应在同一 TCP 连接上传输,则服务器仅在所有数据完成流式传输到客户端时才会收到停止请求。我想我必须使用异步写入来解决这个问题。这是我的代码:

首先,我创建一个循环以接收来自客户端的连接:

在 ClientInteraction 类的 Process 函数中:

在 HandleRequest 函数中,如果请求是 STREAM,我会以数组的形式向客户端发送数据:

使用此代码,我与客户端连接,向客户端发送数据。但是在所有数据都流式传输之前,我仍然无法收到停止请求。请告诉我解决问题的正确方法。谢谢你。

0 投票
1 回答
3423 浏览

c# - Networkstream.Write() 阻塞问题

我目前正在测试我编写的托管 c# 网络库,但偶尔会遇到问题。这个问题表现为 networkstream.write() 上的一个非常一致的(总是在 30 毫秒内)5000 毫秒块,可能占所有发送操作的 1%。这是在测试环境中,全部在本地运行,每次使用完全相同的数据包大小 (2MB)。在客户端,我不断将以下内容写入连接的网络流:

在服务器端我使用异步读取等待数据。一旦数据出现,我会在 tcpClientNetworkStream.DataAvailable 上使用 while 循环,直到收到所有数据。

我知道如果缓冲区已满,networkstream.write() 可能会阻塞,但如果这是问题所在,我想不出在服务器端清除它们的更快方法(发送和接收缓冲区大小默认为 8192 字节) . 块如此一致的事实似乎很奇怪。我的第一个想法可能是某种形式的 Thread.Sleep 但做一个完整的项目搜索显示没有。如果有人可以帮助阐明这个问题,将不胜感激。

马克

编辑添加:似乎使问题消失的黑客如下(尽管由于 BlockCopy 存在相关的性能损失):

编辑 add2:我还通过使用两个异步写入和两者之间的线程信号重现了该问题。目前我唯一的解决方案是上面编辑中的单写操作。

编辑 add3:好的,接下来是另一个可能的修复。我仍然很想知道为什么连续写入偶尔会以它的方式“阻塞”。

编辑到 add4:经过进一步广泛测试后,“编辑到 add3”中的解决方案并没有解决问题,它只是将发生率降低到大约 0.1% 的发送。好多了,但远未解决。接下来我将用阻塞读取替换异步读取,以查看是否对其进行排序,如 PaulF 所建议的那样。

0 投票
3 回答
3259 浏览

c# - NetworkStream BeginRead 只读取一次?

我有一些非常简单的代码,可以从它连接的网络流中读取行。在代码示例中,每次读取只有一行,并且不会继续从服务器获取更多内容。

怎么了?