客户端:

void qt_boost::pbSendFileClicked()
{
 QString filename = ui.leFileName->text();
 QByteArray ba = filename.toLatin1();
 char * pfilename = ba.data();
 std::ifstream ifs(pfilename, ios::in|ios::binary|ios::ate);
 long size = ifs.tellg();
 char *p = new char[size];
 ifs.seekg(0, ios::beg);
 ifs.read(p, size);
 ifs.close();
 
 tcp::resolver _resolver(*ioService);
 tcp::resolver::query query(tcp::v4(), "127.0.0.1", "10800");
 tcp::resolver::iterator _iterator = _resolver.resolve(query);
 tcp::socket _socket = tcp::socket(*ioService);
 boost::asio::connect(_socket, _iterator);
 char psize[4];
 int *pint = (int *)psize;
 *pint = size;
 boost::asio::write(_socket, boost::asio::buffer(psize, sizeof(psize)));
 boost::asio::read(_socket, boost::asio::buffer(psize, sizeof(psize)));
 boost::asio::write(_socket, boost::asio::buffer(p, size));
 delete[] p;
}

调用QT的QFileDialog::getOpenFileName获取文件名称,保存在ui.leFileName控件中.使用ifstream加载文件,获取文件大小并将文件内容写入到动态数组中.向服务端发送文件大小,读取服务端回发信息后,发送文件内容.

服务端:

void session::start()
{
 //文件传输 首先接收文件大小
  socket_.async_read_some(boost::asio::buffer(data_, max_length),
  boost::bind(&session::handle_read, this, 
  boost::asio::placeholders::error,
  boost::asio::placeholders::bytes_transferred));
}

void session::handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
 if(!error)
 {
  //文件传输 接收文件大小 并回发文件大小信息 通知客户端继续发送文件内容
  int *p = (int *)data_;
        filesize = *p;
   socket_.async_write_some(boost::asio::buffer(data_, bytes_transferred),
   boost::bind(&session::handle_write, this, boost::asio::placeholders::error)); }
 else
 {
  delete this;
 }
}

void session::handle_write(const boost::system::error_code &error)
{
 if(!error)
 {

//接收文件内容
  p = new char[filesize];
  boost::asio::async_read(socket_, boost::asio::buffer(p, filesize), 
   boost::bind(&session::handle_readfile, this, boost::asio::placeholders::error));
 }
 else
 {
  delete this;
 }
}

void session::handle_readfile(const boost::system::error_code &error)
{
 if(!error)
 {

//接收完毕将文件内容存入磁盘
   std::ofstream ofile("C:\\zzz.txt");
   ofile.write(p, filesize);
   ofile.close();
 }
 else
  delete this;
}

问题:只能传输文本文件,如果要传输任何类型文件,可以修改ifstream的构造函数参数.

改进:为了可传输任意类型的文件,将文件后缀名称放在前20个字节中发送给服务端,服务端解析出后缀拼接到文件名称中.

客户端拼包代码:

QString filename = ui.leFileName->text();
 QFileInfo finfo(filename);
 QByteArray ba = filename.toLatin1();
 char * pfilename = ba.data();
 //处理后缀
 QString fileext = finfo.suffix();
 QByteArray baext = fileext.toLatin1();
 char *pfileext = baext.data();
 std::ifstream ifs(pfilename, ios::in|ios::binary|ios::ate);
 long size = ifs.tellg();
 char *p = new char[size + 20];//分配一个与文件大小相同的数组 前20个字节放文件后缀
 memset(p, 0, size + 20);
 memcpy(p, pfileext, baext.size());
 ifs.seekg(0, ios::beg);  //将当前位置置为0
 ifs.read(p + 20, size);       //将文件内容读入到数组中,待发送
 ifs.close();             //关闭文件

服务端接收代码:

void session::handle_readfile(const boost::system::error_code &error)
{
 if(!error)
 {
  char fileext[20] = {0};
  strcpy(fileext, p);
  char filename[255] = "C:\\zzz.";
  strcat(filename, fileext);
  std::ofstream ofile(filename, std::ios::out|std::ios::binary|std::ios::ate);
  ofile.write(p + 20, filesize);
  ofile.close();
 }
 else
  delete this;
}

改进中文文件名的乱码问题:

客户端读取文件流部分代码改为使用QFile类实现:

QFile file(filename);
 file.open(QIODevice::ReadOnly);
 long size = file.size();
 char *p = new char[size + 20];
 memset(p, 0, size + 20);
 memcpy(p, pfileext, baext.size());
 file.seek(0);
 file.read(p + 20, size);
 file.close();

http://blog.csdn.net/henreash/article/details/7534804

qt+boost::asio+tcp文件传输的更多相关文章

  1. 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  2. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  3. boost asio tcp 多线程异步读写,服务器与客户端。

    // server.cpp #if 0 多个线程对同一个io_service 对象处理 用到第三方库:log4cplus, google::protobuf 用到C++11的特性,Windows 需要 ...

  4. boost asio tcp server 拆分

    从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...

  5. Java 简单TCP文件传输

    服务端 package TCP; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt ...

  6. boost::asio::tcp

    同步TCP通信服务端 #include <boost/asio.hpp> #include <iostream> using namespace boost::asio; in ...

  7. Go语言 之TCP文件传输

    服务端实现流程大致如下: 创建监听listener,程序结束时关闭. 阻塞等待客户端连接,程序结束时关闭conn. 读取客户端发送文件名.保存fileName. 回发“ok”给客户端做应答 封装函数 ...

  8. boost asio tcp 多线程

    common/pools.h // common/pools.h #pragma once #include <string> #include <boost/pool/pool.h ...

  9. python基础实现tcp文件传输

    准备工作,实现文件上传需要那些工具呢? socket(传输).open()(打开文件).os(读取文件信息),当然还有辅助类sys和json,下面我们开始吧 import socket,sys imp ...

随机推荐

  1. AFNetworking2.5使用2

    链接地址:http://blog.csdn.net/abc4715760/article/details/46521111 官网下载2.5版本:http://afnetworking.com/ 此文章 ...

  2. Android--开发过程中使用到的长度单位

    px:表示屏幕实际的像素. in:表示英寸. mm:毫米. pt:表示一个点,是屏幕的物理尺寸. dp:(与密度无关的像素)逻辑长度单位,在160dpi屏幕上,1dp = 1px = 1/160英寸 ...

  3. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  4. IE浏览器下web调试工具之--IE WebDeveloper介绍

    做Web项目的架构设计.开发.测试,免不了要熟悉Web页面调试工具,以此来获知哪些浏览器支持Web页面的显示,哪些浏览器下显示有问题. 目前市面上比较火爆的浏览器内核提供商,有微软的IE.mozill ...

  5. ImageMagick 压缩图片 方法

    Images as a percentage of page weight for the Alexa top 10 global web sites  图片在站点所占的比重越来越重.更好的优化图片能 ...

  6. poj1573&amp;&amp;hdu1035 Robot Motion(模拟)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接: HDU:pid=1035">http://acm.hd ...

  7. 【linux驱动笔记】linux模块机制浅析

      1.   模块module 操作系统分微内核和宏内核,微内核优点,可以使操作系统仅作很少的事,其它事情如网络处理等都作为应用程序来实现,微内核精简的同时,必然带来性能的下降.而linux的宏内核设 ...

  8. perl use base 代替 @ISA

    packge Mule; use base ("Horse", "donkey"); # 声明一个超类 它是下面东西的缩写: package Mule; BEG ...

  9. HTML文档类型DTD与浏览器怪异模式

    虽然在兼容IE6时候经常会注意到两个模式的区别,但是系统的理解起来,还没有认真总结过.看了一些网上的资料.结合自己的理解汇总了一下,放在这里备忘并分享给大家. 浏览器从服务端获取网页后会根据文档的DO ...

  10. LoadRunner监控数据库服务器

    使用LoadRunner的数据库服务器资源监控器,可以在场景或会话步骤运行期间监控DB2.Oracle.SQL Server或Sybase数据库的资源使用率.在场景或会话步骤运行期间,使用这些监控器可 ...