我正在创建简单的 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
方法返回正确的图像大小作为发送值。
由于某种原因,我无法在 Windows 8 上的 Adobe 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>());
我的字符串将是 ~500 个字符而不是 124Kbytes(~124k 字符,图像文件大小)。
这是 C++ 图像结果:
所以我真的不知道为什么socket传输只有很小的一部分jpeg
正确而其余的都是错误的?正如我所提到的 - 如果我将字节数组从 C# 传输到 Flex 没有问题,所以我假设 Flex 端一切正常。