2

これが事実です。私はゲームを作りたいです。クライアントはフラッシュで作成され、サーバーはJavaで作成されます。サーバー側から、ストリームに書き込む最初のバイトは、次のようなプロトコル ID です。

try 
{
 Output.writeByte(LOGIN);
 Output.writeByte((byte)ID);
 Output.writeByte(new_position.x);
 Output.writeByte(new_position.y);
 Output.flush();
} 

「onResponse」イベントがトリガーされた後、ソケットは次のように読み取られます。

type:int = socket_client.readByte();
if (type == 0x1)
FP.console.log("You are logged as " + socket_client.readByte() + " in x:" + socket_client.readByte() + " y:" +  socket_client.readByte() );
else if (type == 0x2)
      FP.console.log("You are now in x:" + socket_client.readByte() + " y:" +  socket_client.readByte());

もうお気づきかもしれませんが、これは私にいくつかの問題をもたらします。サーバーが情報を 2 つに分割して送信する場合があるため、上記のコードは EOF 例外をスローします。次のコードをトレースすると、次の結果が得られることがあります。

trace("SIZE: " + socket_client.bytesAvailable);
//var type:int = socket_client.readByte();
var values:String = "";
while (socket_client.bytesAvailable > 0)
       values += socket_client.readByte() + " ";
trace(values);`

値:

 SIZE: 1
 2 
 SIZE: 2
 2 6 

最初の「2」はプロトコル ID、2 番目と 3 番目は x と y の値を表します。さて、問題は、どうすればこれを防ぐことができるかということです。必要な情報がすべて揃うまで、どうすれば「待つ」ことができますか? ところで、Javaではこれは決して起こりませんが、as3よりも制御できません。

4

2 に答える 2

2

次のように出力の初期化を追加BufferedOutputStreamします。

Output = new DataOutputStream(new BufferedOutputStream(connection.getOutputStream()));
于 2012-12-10T02:14:57.340 に答える
1

[type, data]基本的に、メッセージ形式を からに切り替える必要があります[type, length, data]。次に、bytesAvailable>=lengthになるまでデータの処理を待ちます。それ以外の場合は、データをバッファに入れます。

SOCKET_DATAこのロジックを使用するハンドラーの例を次に示します。

https://github.com/magicalhobo/Flash-CS5-mobile-proxy/blob/master/com/magicalhobo/mobile/proxy/MobileClient.as#L110

于 2012-12-10T02:28:38.557 に答える