1

我一直在尝试在 AS3 中编程套接字,但我遇到了一些问题。

我正在使用 C++ 服务器和 Flash AS3 客户端。这是我在第一场比赛中的糟糕尝试,所以这里什么都没有。我的编程经验很少,所以请多多包涵。

这是我从服务器发送到客户端(十六进制)的内容:

S = Packet Size, C = Content, H = Header(基本上告诉客户端这个包做了什么)

S  H  C..
06 02 00 00 00 00
06 03 D1 13 01 07
02 04

但是,当我的 flash 客户端收到信息时,它是这样接收的:

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

我不知道为什么其中一条消息是重复的!我在我的 C++ 服务器上的写入函数中放置了一个 trace(),看起来我肯定会发送一次,但我的 Flash 客户端读取它两次。

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 从套接字读取它两次。

将不胜感激任何帮助,谢谢。

更新:好的,我终于想出了如何在 Windows 上嗅探本地主机流量,事实证明,服务器发送了两次消息,这不是客户端的错 :D 每个数据包生成后,函数 outputMessage 只调用一次,但由于某种原因,同一个数据包仍然被设置了两次。我想这是一个与提升相关的问题,而不是 Flash。

更新2:我修好了!!!这是一件非常非常愚蠢的事情,我什至不知道这是错误的。在服务器端,我有一些类似的东西:

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);

我觉得好傻。真的很抱歉浪费了你的时间...

4

0 回答 0