问题标签 [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# - 通过 NetworkStream 一次性发送的最小保证字节数
我正在使用 TcpClient 的 NetworkStream 将字节从 .NET 服务器发送到通过套接字接收它们的 Silverlight 客户端。从客户端发送是通过 Socket.SendAsync 完成的。
我的问题是,我可以期望在双方“一次性”接收到的最小字节数是多少,而无需发送消息长度并将几个字节消息放在一起。
谢谢,安德烈
c# - TcpClient.GetStream().DataAvailable 返回 false,但流有更多数据
因此,似乎阻塞的 Read() 可以在完成接收所有发送给它的数据之前返回。反过来,我们用一个循环包装 Read(),该循环由相关流中的 DataAvailable 值控制。问题是你可以在这个while循环中接收更多的数据,但是没有后台处理让系统知道这一点。我在网上找到的大多数解决方案都不适用于我。
我最终做的是作为循环的最后一步,在从流中读取每个块后,我做了一个简单的 Thread.Sleep(1) 。这似乎给了系统更新的时间,我没有得到准确的结果,但这似乎有点 hacky 并且对于解决方案来说有点“间接”。
以下是我正在处理的情况列表: IIS 应用程序和独立应用程序之间的单个 TCP 连接,两者都是用 C# 编写的,用于发送/接收通信。它发送一个请求,然后等待响应。此请求是由 HTTP 请求发起的,但我在从 HTTP 请求中读取数据时没有遇到此问题,这是事后的情况。
这是处理传入连接的基本代码
欢迎所有反馈以获得更好的解决方案,或者只是在我们检查 DataAvailable 值之前需要给予 Sleep(1) 以允许事情正确更新的竖起大拇指。
我想我希望 2 年后这个问题的答案不是现在的情况:)
c# - NetworkStream.Read() 和 NetworkStream.BeginRead() 之间的区别?
我需要读取NetworkStream
哪个会随机发送数据,并且数据包的大小也不断变化。我正在实现一个多线程应用程序,其中每个线程都有自己的流可供读取。如果流上没有数据,应用程序应该一直等待数据到达。但是,如果服务器完成发送数据并终止会话,那么它应该退出。
最初我使用该Read
方法从流中获取数据,但它曾经阻塞线程并一直等待直到数据出现在流中。
MSDN 上的文档建议,
如果没有数据可供读取,Read 方法返回 0。如果远程主机关闭连接,并且已接收到所有可用数据,则 Read 方法立即完成并返回零字节。
但就我而言,我从来没有得到Read
返回 0 并优雅退出的方法。它只是无限期地等待。
在我进一步的调查中,我遇到了BeginRead
哪个监视流并在收到数据后立即异步调用回调方法。我也尝试使用这种方法寻找各种实现,但是,我无法确定何时使用BeginRead
而不是Read
.
正如我所看到的,它BeginRead
具有异步调用的优点,它不会阻塞当前线程。但是在我的应用程序中,我已经有一个单独的线程来读取和处理来自流的数据,所以这对我来说并没有太大的区别。
任何人都可以帮助我了解等待和退出机制,
BeginRead
它有什么不同Read
?实现所需功能的最佳方式是什么?
c# - 如何估计要从 NetworkStream 读取的字节数组/缓冲区的大小?
我需要从 NetworkStream 中读取,它会以高速率连续不断地输入数据。我想知道
- 设定值的依据应该是什么
bufferSize
? - 无论环境如何,都可以选择标准的“安全”值吗?
- 它是否也应该随着我试图从(FileStream/NetworkStream/..)读取的流而变化?
请考虑性能作为评估的重点。
c# - TCP服务器在.NET中发送太快
我正在.NET 中制作一个客户端-服务器应用程序,但现在我遇到了一个问题,即我尝试发送一些东西,客户端正在读取它,而在阅读时我正在发送其他东西,所以它会使发送的数据变得废话。
例子:
- 我发送测试
- 客户开始阅读
- 我发送 endtest
- 客户端读取 test@$>@est
有没有办法解决这个问题?现在我正在做一个Thread.Sleep(10)
发送后,但我认为有更好的方法:P。
PS我用的是NetworkStream.Write()/Read()
,不是NetworkStream.BeginWrite()/BeginRead()
。这两个哪个更好,为什么?
c# - 网络流池化
我有一个多线程应用程序,它通过 TCP 连接与服务器通信。该应用程序将部署为 Windows 服务。
它的实现方式是,Controller
它创建Communicator
对象、分配端口号、消息计数等属性,Communicator
并调用它的StartClient
方法来开始与服务器的对话。
在该StartClient
方法中,每个Communicator
对象使用由Controller
. 建立连接后,它在内部创建一个线程并调用该ReadMessages
方法不断从服务器读取,直到达到消息计数然后关闭。
根据运行时条件,可能需要重用Communicator
对象以再次与服务器通信,因此ReadMessages
将再次调用该方法。
最初,当方法完成时,我们一直在调用Dispose()
NetworkStream、StreamReader 和 StreamWriter 对象的ReadMessages
方法,但是在重新连接的情况下,它曾经抛出“无法访问已处理的对象”错误。因此,我们注释掉了Dispose
用于测试的方法调用。
到目前为止,它工作正常,但我担心,这不是实现此功能的最佳方式,因为我从未处理过对象。
我在考虑对象池,如果有可能有一个可以被不同线程重用的 Stream 对象池?
解决这个问题的一种方法是在每次Communicator
与服务器连接时创建一个 Stream 对象的新实例,但我认为这将是一项昂贵的操作。
您能否帮我确定一种更好的方法来处理这里的情况,以便我可以重用该Communicator
对象而不会影响性能?
java - 您可以在不停止通过同一个 java.net.socket 的其他数据的情况下发送图像吗?
这是这种情况:
我正在做一个项目,我需要能够不时地向/从服务器发送一个或多个图像以及许多其他类型的以文本表示的数据。当前完成的方式是发送一条消息,上面写着“传入的大小为 x 的图像将用作 y”(当然,它不是“公式化”的),然后我调用一个读取下一个 x 的方法字节通过 DataInputStream。起初我遇到了一些延迟问题,但我让服务器产生了一个新线程来发送“传入图像”消息,然后等待客户端响应“我准备好了”时设置的标志为图像”消息。它现在以某种方式工作,但是如果在传输图像时发送了其他任何内容,例如聊天消息,用于 BufferedReader 的消息将作为原始字节读取并用作图像的一部分。因此,当正在发送图像时,我将不得不阻止所有传出数据(并将其添加到队列中)。但这似乎非常错误和烦人,因为应用程序的用户在接收/上传大图像时将无法聊天。
这就是我需要的:所以,我要么需要设置一个独立的通道来用于原始数据。据我所知,我将不得不在新端口上设置一个新套接字,这似乎没有必要。我可以看到解决这个问题的另一种方法是以某种方式使用“这是文本/原始数据”位标记每个数据包,但我不知道如何用 java 做到这一点?当您将某些内容写入流(包含该信息的每个数据包都将包含)然后在另一端读取数据包数据并采取相应措施时,您能否将信息添加到数据包标头?
如您所见,我对网络没有太多经验,也没有长时间使用Java。这也是我在这里的第一篇文章,所以请善待。如果有什么不清楚的,请询问,我会具体说明。欢迎所有想法!(可能有一种标准方法可以做到这一点?)
非常感谢!
c# - 如何从服务器读取消息?(TCP)
客户端写入服务器 - 服务器读取。和服务器写入客户端 - 客户端未读取。
服务器:
客户:
c# - 如何测量 C# NetworkStream.Read 所花费的时间?
我想测量客户端使用 c# 通过 tcp 接收数据所花费的时间。
我使用 NetworkStream.Read 读取使用 NetworkStream.Write 发送的 100 兆位数据。我将缓冲区设置为相同大小的数据,因此没有缓冲区欠载问题等。一般看起来像这样。
问题是,发送者可能没有实际发送数据,但秒表已经在运行。如何准确测量接收数据所需的时间?我确实尝试使用远程 pc 流的时间流逝。写入,但写入所需的时间非常小。顺便问一下,秒表是完成这项任务最准确的工具吗?
c# - 异步网络流到文件流(反之亦然)
我有一个客户端/服务器应用程序。它们在接收数据时都使用异步调用。它使用 TCP 构建,主要用于发送文件。
一个命令沿着一个套接字发送,然后将其“转换”为一个简单的开关盒并进行操作。如果客户端发送命令“SENDFILE”,我希望服务器能够输入一个调用一个函数的案例,该函数然后处理该套接字上的任何进一步数据并将其组合到一个文件中。
这是服务器端的 OnDataReceive 回调函数和 switch case:
这里异步读取网络流并同步写入文件流的类:对吗?
我遇到的问题是相反,从文件流读取到网络流,我应该从文件流异步读取并同步写入网络流吗?
还因为在上面的示例中,第一次调用 Start() 并且函数结束时它会返回到服务器开关盒,然后任何进一步的(文件)数据都会命中Packet returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);
和错误:(
*编辑 1 *
我不能使用任何外部库或大量代码,这必须从头开始构建。
这不是典型的客户端-服务器应用程序,它更多的是 p2p,但不完全是,每个应用程序都有自己的服务器和客户端在不同的线程中运行,这允许多个应用程序相互连接,从而创建一个......网络。
客户端告诉服务器它正在向它发送文件,它不会从服务器请求文件