1

我为 Windows Phone 7 开发了一款不错的免费游戏,名为 Domination,尽管发布较早,但还是相当成功的!

现在,我正在开发一个在线多人游戏版本,它考虑到有趣的功能,现在我已经接近尾声了,我遇到了一个大问题。

奇怪的数据包丢失,或类似的东西。

我有一个重现问题的样本。

我有一个服务器。我有一个 Win Form 客户端 我有一个 XNA 客户端

重现问题的步骤:

1)你启动服务器,win form和游戏(你需要一个模拟器和WP7 SDK)

2) 现在,您按下 GO 按钮,表单将打开到服务器的 TCP 通道

3)现在,你按下模拟器上的屏幕,表单将打开到服务器的 TCP 通道

4)现在,每次你按下屏幕模拟器,或者win表单上的GO按钮,服务器都会在正确的客户端上向你发送50条消息

好吧,问题是

1)win form 通常会收到 50 条消息,很少会在一次通信中丢失 10 个数据包,但这很罕见

2) 模拟器,总是丢失 30-40-45 条消息!!!!!!

我尝试了其他方法,但没有任何改变..

一个提示,如果我放置一个 Thread.Sleep(10) ,其中 10 是 10 毫秒,对于每个服务器发送,它工作得很好!!

任何人都可以帮助我吗?我只是不知道把头放在哪里!

样品可以在这里找到:

http://uploading.com/files/d7e7939c/Projects.zip/

4

1 回答 1

1

没有消息丢失。他们都被接收了。您的代码只是没有正确解释接收到的数据。如果您查看接收到的字节数,那将是正确的。如果您查看接收到的字节中的数据,那将是正确的。其余的取决于您的代码。

TCP 提供字节流服务。这意味着你会得到你发送的相同字节。如果您需要将这些字节“粘合”到消息中,那么您必须编写代码来执行此操作。如果您发送30 个字节,您可能会收到 30 个字节,或者 10 个字节然后是 20 个字节,或者 1 个字节 30 次,或者介于两者之间的任何内容。如果您先发送 5 个字节,然后再发送 3 个字节,您可能会收到 5 个字节,然后是 3 个字节。或者您可能会收到 8 个字节。或者您可能会收到 1 个字节 8 次。

必须定义消息格式。必须对发件人进行编码才能以该格式发送消息。必须对接收者进行编码以识别它何时收到完整的消息。

发生的事情是您发送“FOO”,然后发送“BAR”并接收“FOOBAR”。在这个过程中,除了“FOO”和“BAR”之间的界限之外,什么都没有丢失。但是,TCP 没有消息边界的概念。如果你需要它们,你必须对它们进行编码。例如,您可以发送“3FOO3BAR”。现在,无论它是如何接收的,接收者都知道“FOO”是一条消息,而“BAR”是另一条消息。另一种选择是“foo\nbar\n”(foo newline bar 换行符)。接收者在接收到换行符时就知道它有一个完整的消息。

但是,无论您如何定义应用程序级消息,您都必须实际编写代码来执行此操作。它不会自己发生。

于 2012-05-17T11:25:54.067 回答