2

シンプルなソケットサーバーを作成しています。Flex アプリケーションは、このサーバーのクライアントになります。特別なリクエストで、画像ファイル (jpeg) をサーバーからソケット経由でクライアントに転送する必要があります。

私はすでにテスト目的で C# でサーバーを作成しました。これは、私のフレックス アプリで問題なく動作します。

画像を送信する C# コード:

private void sendImage(Socket client)
        {
            Bitmap data = new Bitmap("assets/sphere.jpg");
            Image img = data;
            MemoryStream ms = new MemoryStream();
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] buffer = ms.ToArray();
            sendInt(client, buffer.Length);
            client.Send(buffer);
            Console.WriteLine("Image sent");
        }

同じ画像を送信する C++ コード:

void SocketServer::sendFile(SOCKET &client, std::string filename)
{
    std::ifstream file (filename, std::ios::ate);
    if (file.is_open())
    {
        std::ifstream::pos_type size = file.tellg();
        char * memblock = new char [size];
        file.seekg (0, std::ios::beg);
        file.read (memblock, size);
        file.close();
        sendInt(client, size);
        send(client, memblock, size, 0);
        delete[] memblock;
    }
}

sendメソッドは、送信された値として適切な画像サイズを返します。

Windows 8 の Adob​​e Flash Builder 4.6 でなぜかデバッグできないので、転送結果を文字列として表示できる出力ウィジェットを作成しました。

C# 転送結果: ここに画像の説明を入力

C++ 転送結果: ここに画像の説明を入力

ご覧のとおり、最初の 500 文字ほどは同じです。C++ の残りの部分は、これらの 'i' シンボルです。奇妙なことに、たとえば次のコードを使用してファイルを文字列に読み込むと、次のようになります。

std::ifstream ifs("sphere.jpg");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

私の文字列は 124K バイト (~124k 文字、画像ファイル サイズ) ではなく、~500 文字になります。

C++ イメージの結果は次のとおりです。 ここに画像の説明を入力

だから、ソケット転送が正しくごく一部だけでjpeg残りが間違っている理由が本当にわかりませんか?先に述べたように、C# から Flex にバイト配列を転送しても問題はないので、Flex 側ではすべて問題ないと思います。

4

1 に答える 1

1

ファイルを明示的にバイナリ モードで開いていないことが原因である可能性があります。使用してみてください:

std::ifstream file (filename, std::ios::ate | std::ios::binary);
于 2012-11-03T20:19:44.320 に答える