通过 SOCKET 发送文件

Posted

技术标签:

【中文标题】通过 SOCKET 发送文件【英文标题】:Send file over SOCKET 【发布时间】:2012-11-03 19:21:07 【问题描述】:

我正在创建简单的 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 上的 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>());

我的字符串将是 ~500 个字符而不是 124Kbytes(~124k 字符,图像文件大小)。

这是 C++ 图像结果:

所以我真的不知道为什么套接字只正确传输了jpeg 的一小部分而其余部分是错误的?正如我所提到的 - 如果我将字节数组从 C# 传输到 Flex 没有问题,所以我假设 Flex 端一切正常。

【问题讨论】:

client.Send() 的返回值是多少? @NathanMoinvaziri 它等于 buffer.length() 或 ~124K - 确切的图像文件大小。 您是否尝试过在打开文件时显式使用二进制打开模式? @NathanMoinvaziri 哇,它有效!非常感谢=)如果您将其写为答案,我会标记您的帖子。 【参考方案1】:

这可能是因为您没有明确地以二进制模式打开文件。尝试使用:

std::ifstream file (filename, std::ios::ate | std::ios::binary);

【讨论】:

以上是关于通过 SOCKET 发送文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 ObjectOutputStream 通过 Socket 发送多个文件

通过socket android发送大文件

6 通过Socket发送文件

通过Socket.SendFile发送大文件

如何通过socket编程在两台机器之间发送文件?

Python-socket发送文件并解决粘包问题