TCP服务器在.NET中发送得太快

时间:2010-12-20 07:49:20

标签: c# .net tcp client-server networkstream

我正在使用.NET创建一个客户端 - 服务器应用程序,但现在我遇到的问题是我尝试发送一些内容,客户端正在阅读它,而在阅读时我正在发送其他内容,因此它会使发送的内容变为废话数据

示例:

  1. 我发送测试
  2. 客户端开始阅读
  3. 我发送endtest
  4. 客户端阅读测试@ $> @est
  5. 有没有办法解决这个问题?现在我在发送后正在做Thread.Sleep(10),但我认为还有更好的方法:P。

    P.S。我使用的是NetworkStream.Write()/Read(),而不是NetworkStream.BeginWrite()/BeginRead()。这两个中哪一个更好,为什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

你应该考虑使用带有nettcpbinding的WCF来处理这种事情,特别是如果两端(客户端/服务器)都在C#中。

我之前在编写自定义tcp代码时遇到了类似的问题,但转移到wcf并且它更加容易,而且更加稳定,因此您可以专注于编写应用程序代码。

答案 2 :(得分:0)

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

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

然后再说一遍,也许你正在做的代码示例可以帮助我们确切地指出你做错了什么。