AS3 でソケットのプログラミングを試みていますが、少し問題があります。
C++ サーバーと Flash AS3 クライアントを使用しています。これは最初のゲームでの私の貧弱な試みなので、ここでは何も起こりません. 私はプログラミングの経験がほとんどないので、ご容赦ください。
これは、サーバーからクライアント (HEX) に送信するものです。
S = パケット サイズ、C = コンテンツ、H = ヘッダー (基本的に、このパケットが何をするかをクライアントに伝えます)
S H C..
06 02 00 00 00 00
06 03 D1 13 01 07
02 04
ただし、フラッシュ クライアントが情報を受信すると、次のように受信されます。
S H C..
06 02 00 00 00 00
06 03 D1 13 01 07
06 03 D1 13 01 07 -- weird duplicate?
02 04
メッセージの 1 つが重複している理由がわかりません。C++ サーバーの書き込み関数に trace() を配置しました。間違いなく 1 回送信しているように見えますが、Flash クライアントはそれを 2 回読み取ります。
s.addEventListener(ProgressEvent.SOCKET_DATA, sData);
function sData(e:ProgressEvent):void
{
while(true){
try {
GetByte(); //packet size, im ignoring it for now
parsePacket();
}
catch (error:Error)
{
trace(error);
break;
}
}
}
function parsePacket()
{
var header:uint = GetByte();
trace("New Packet: ", header);
switch (header){
case 0x01:
//dostuffwithcontent
break;
case 0x02:
//i use it 4 times so there is no "leftover"
//i actually do stuff with the bytes in real code, but this is only to make it easier to read
GetByte();GetByte();GetByte();GetByte();
break;
case 0x03:
//this is called twice
//Flash is reading the same info 2 times from the socket, even though it has only been sent once.
GetByte();GetByte();GetByte();GetByte();
break;
case 0x04:
trace("last packet received");
break;
default:
break;
}
}
function GetByte():uint{return socket_.readUnsignedByte();}
これは、情報を送信するために使用する C++ 関数です。各「パケット」の後に一度呼び出します。
void outputMessage(NetworkMessage& msg)
{
std::cout << msg.size() << std::endl; //never called more than required, and always shows correct size
boost::asio::async_write(socket_,boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, this,boost::asio::placeholders::error));
}
私は何を間違っていますか?Flash がソケットから 2 回読み取っている理由がわかりません。
助けていただければ幸いです、ありがとう。
更新: わかりました、ようやく Windows で localhost トラフィックを盗聴する方法を見つけました。結局のところ、サーバーはメッセージを 2 回送信していますが、それはクライアントのせいではありません:D 関数 outputMessage は、すべてのパケットが生成された後に 1 回だけ呼び出されます、しかし、何らかの理由で、同じパケットがまだ 2 回設定されています。これはフラッシュではなく、ブースト関連の問題だと思います。
Update2: 修正しました!!! それは非常にばかげたことでした。これが間違っていることさえ知りませんでした。サーバー側では、次のようなものがありました。
NetworkMessage msg;
msg.AddByte(0x03);
outputMessage(msg);
NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);
両方の変数が同じ名前であるため、明らかにエラーが発生したため、名前を変更する代わりに、これを試しました (プログラムには奇妙な副作用があったため、これは明らかに間違っています)。
{
NetworkMessage msg;
msg.AddByte(0x03);
outputMessage(msg);
}
NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);
私はとてもばかげていると感じます。お手間をおかけして本当に申し訳ありません…