C# TcpClient,同时读写流

Posted

技术标签:

【中文标题】C# TcpClient,同时读写流【英文标题】:C# TcpClient, read and write stream simultaneously 【发布时间】:2016-01-15 19:25:27 【问题描述】:

我知道这个问题已经在 SO 上被问过好几次了,但没有一个线程解决了我们目前面临的完全相同的问题。

我们基本上是在开发 TCP 服务器/客户端应用程序,其中服务器是用 Java 编写的,而客户端是用 C# 编写的。 我在 Java 端,我正在为我的缓冲区使用分离的输入和输出流。

我们的问题是,如果客户端从服务器接收消息并异步读取这些消息并从缓冲区中读取这些消息,并在该过程中尝试向其中写入内容,则会引发异常 - 不足为奇。

我的问题是:在这种情况下该怎么做?创建单独的流?我们已经尝试过了,但似乎 C# 不希望我们这样做。我们迫切需要一个解决方案,非常感谢任何帮助!

【问题讨论】:

基本上,您需要C#中的解决方案来同时读取和写入吗? java端工作了吗? 是的,它正在工作。我们刚刚解决了这个问题 - 但仍然想知道是否有办法在 c# 中分离流 【参考方案1】:

不,它应该工作。您需要的是TcpClient,您可能已经拥有了。从那里TcpClient.GetStream(),返回NetworkStream。然后读取和写入操作可以同时/同时发生,而无需同步。所以读和写可以同时发生。

必须同步的是多个并发读取。所有并发读取都必须通过lock(objReads)同步。

同样,多个并发写入必须通过lock(objWrites)同步。

MSDN says,这是有保证的。

请注意,我已经说清楚了,读和写有不同的锁。

【讨论】:

我们已经解决了,问题在我们这边 - 但感谢您的额外解释!现在我也知道我只是不需要单独的流。 @neil-patrao 感谢您改进答案:)。 你放置到msdn的链接,没有提到任何关于并发问题的事情 它被埋得更深了,因为TcpClient正在返回NetworkStream,在那里它表达得更详细,谈论单线程访问,需要同步等,但即使在那里也不是很好解释。那些 .NET/C# 作者靠写书赚钱是有原因的:)。

以上是关于C# TcpClient,同时读写流的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中同时读写文件

C# 多线程同步访问一个文件怎么处理

30天C#基础巩固------读写流(StreamWrite/StreamReader)

C# TcpClient的Connect超时处理(Timeout)

c# TcpClient简易聊天工具

TcpClient 与服务器通信以保持 C# 中的活动连接?