1

私は Windows Phone 7 用の素敵な無料ゲームを開発しました。これは Domination と呼ばれ、初期のリリースにもかかわらず、大成功を収めています。

今、私は興味深い機能に関するオンラインマルチプレイヤーバージョンを開発していますが、ほとんど終わりに近づいた今、大きな問題に遭遇しています.

奇妙なパケット損失、またはそのようなもの。

問題を再現するためのサンプルがあります。

私はサーバーを持っています。私は Win Form クライアントを持っています 私は XNA クライアントを持っています

問題を再現する手順:

1) サーバー、勝利フォーム、およびゲームを開始します (エミュレーターと WP7 SDK が必要です)。

2) ここで [GO] ボタンを押すと、フォームがサーバーへの TCP チャネルを開きます

3) ここで、エミュレーターの画面を押すと、フォームがサーバーへの TCP チャネルを開きます。

4) これで、スクリーン エミュレーターを押すか、win フォームの [GO] ボタンを押すたびに、サーバーは適切なクライアントで 50 メッセージを送り返します。

さて、問題は

1) win フォームは通常 50 個のメッセージを受信し、1 回の通信で 10 個のパケットを失うことはめったにありませんが、まれです。

2) エミュレーターは、常に 30-40-45 メッセージを失います!!!!!

私は他の方法を試しましたが、何も変わりませんでした..

1 つのヒントとして、10 が 10 ミリ秒である Thread.Sleep(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」が1つのメッセージであり、「BAR」が別のメッセージであることを認識します。もう1つの選択肢は、「foo \ nbar \ n」(foo newline bar newline)です。受信者は、改行文字を受信したときに完全なメッセージがあることを認識しています。

ただし、アプリケーションレベルのメッセージを定義する場合でも、実際にそれを行うためのコードを作成する必要があります。それだけでは起こりません。

于 2012-05-17T11:25:54.067 に答える