Я создаю простой сервер Socket. Приложение Flex будет клиентом для этого сервера. По специальному запросу мне нужно передать файл изображения (JPEG) с сервера на клиент через сокет.
Я уже написал сервер на C # для целей тестирования — и он отлично работает с моим приложением flex.
Код 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
Метод возвращает правильный размер изображения в качестве отправленного значения.
По какой-то причине я не могу отладить в Adobe Flash Builder 4.6 в Windows 8, поэтому я создал выходной виджет, где я могу просмотреть результат передачи в виде строки
C # перенесенный результат:
C ++ передаваемый результат:
Как видите, примерно 500 первых символов одинаковы. Остальная часть C ++ — это символы «i». Странно то, что если я читаю файл в строку, используя этот код, например:
std::ifstream ifs("sphere.jpg");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
моя строка будет ~ 500 символов вместо 124 КБ (~ 124 000 символов, размер файла изображения).
Вот результат C ++ изображения:
Так что я не знаю, почему передача сокетов только очень малая часть jpeg
правильно а остальное не так? Как я уже говорил, проблем с переносом байтового массива из C # во Flex нет, поэтому я предполагаю, что на стороне Flex все в порядке.
Это может быть связано с тем, что вы не открываете файл явно в двоичном режиме. Попробуйте использовать:
std::ifstream file (filename, std::ios::ate | std::ios::binary);
Других решений пока нет …