1

我正在.NET 中制作一个客户端-服务器应用程序,但现在我遇到了一个问题,即我尝试发送一些东西,客户端正在读取它,而在阅读时我正在发送其他东西,所以它会使发送的数据变得废话。

例子:

  1. 我发送测试
  2. 客户开始阅读
  3. 我发送 endtest
  4. 客户端读取 test@$>@est

有没有办法解决这个问题?现在我正在做一个Thread.Sleep(10)发送后,但我认为有更好的方法:P。

PS我用的是NetworkStream.Write()/Read(),不是NetworkStream.BeginWrite()/BeginRead()。这两个哪个更好,为什么?

4

3 回答 3

1

问题可能是您使用同一个套接字来发送多个数据“事物”。您可能知道您发送了一个字符串,然后发送了一个图像,但是 TCP 看不到单独的对象,只有一个字节流。

您也无法知道需要进行多少次读取调用才能获取“第一个”数据对象。描绘多个对象超出了 TCP 的范围。关键是,这个问题最好通过每个事务使用一个套接字来解决。创建一个套接字,在一次写入调用中将整个数据写入其中,然后关闭套接字。让客户端读取,直到您拥有全部数据。如果您需要发送其他内容,请创建一个新套接字。

我知道这并不特定于 NetworkStream 类,但我希望它有所帮助。

于 2010-12-20T08:05:42.510 回答
0

如果我是你,我会在发送和接收数据时创建一个规则。比如说你有一个像 $ 这样的起始字符,而 * 是结束字符。这将帮助您的客户端/服务器系统知道何时读取或何时写入,并最终避免在此过程中出现垃圾。所以就步骤而言:

  • 客户端发送消息 $hello world*
  • 服务器在看到 $ 时开始读取并在 * 之后停止

再说一次,也许你正在做的一个代码示例可以帮助我们准确地找出你做错了什么。

于 2010-12-20T08:09:15.623 回答
0

您应该考虑将 WCF 与 nettcpbinding 一起使用来处理这类事情,特别是如果两端(客户端/服务器)都在 C# 中。

我以前在编写自定义 tcp 代码时遇到过类似的问题,但后来改用 wcf,它更容易、更稳定,因此您可以专注于编写应用程序代码。

于 2010-12-20T08:01:14.127 回答