vs2008+QT+asio tcp客户端测试程序

29 篇文章 0 订阅
10 篇文章 33 订阅

  今天尝试在QT项目中使用asio作为网络通信库,直接将asio的echo同步tcp客户端范例代码移到QT项目中后编译,说WinSock.h已经被包含过,编译不过去.将所有与asio相关的include语句放在最前面,解决了编译问题.但是代码智能提示没有了,好郁闷.查找了很多资料也没有找到解决方法,没办法将所有boost的代码重新编译一次,还是不行.新建一个QT项目,向其中引入boost/array.hpp,没问题,又单独引入其他头文件,也没问题,后来发现不用偷懒的写法:include <boost/asio.hpp>将所有的asio相关的头文件一次性全部包含进来,就不会有问题.因此边移代码边添加相关的头文件,最后连接到asio自带的异步tcp echo范例服务器上测试成功.
头文件代码:
#ifndef QT_BOOST_H
#define QT_BOOST_H

//asio
#include <boost/asio/buffer.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/address.hpp>
#include <boost/asio/ip/address_v4.hpp>
#include <boost/asio/ip/address_v6.hpp>
#include <boost/asio/ip/basic_endpoint.hpp>
#include <boost/asio/ip/basic_resolver.hpp>
#include <boost/asio/ip/basic_resolver_entry.hpp>
#include <boost/asio/ip/basic_resolver_iterator.hpp>
#include <boost/asio/ip/basic_resolver_query.hpp>
#include <boost/asio/ip/host_name.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/write.hpp>
#include <boost/asio/read.hpp>
#include <boost/asio/impl/connect.hpp>
#include <boost/asio/read_until.hpp>
#include <boost/asio/streambuf.hpp>
//qt
#include <QtGui/QMainWindow>
#include "ui_qt_boost.h"
#include <QMessageBox>
#include "windows.h"


using boost::asio::ip::tcp;
using namespace std;

class qt_boost : public QMainWindow
{
 Q_OBJECT

public:
 qt_boost(QWidget *parent = 0, Qt::WFlags flags = 0);
 ~qt_boost();

private slots:
 void pbSendMessageClicked();

private:
 Ui::qt_boostClass ui;
 boost::asio::io_service *ioService;
};

const int max_length = 1024;

#endif // QT_BOOST_H

//实现文件代码:
#include "qt_boost.h"

qt_boost::qt_boost(QWidget *parent, Qt::WFlags flags)
 : QMainWindow(parent, flags)
{
 ui.setupUi(this);
 connect(ui.pbSendMessage, SIGNAL(clicked()), this, SLOT(pbSendMessageClicked()));
 ioService = new boost::asio::io_service();
}

void qt_boost::pbSendMessageClicked()
{
 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 request[max_length];
 QByteArray ba = this->ui.leMessage->text().toLatin1();
 memcpy(request, ba.data(), ba.size());
 request[ba.size()] = '\n';
 size_t request_length = ba.size() + 1;
 boost::asio::write(_socket, boost::asio::buffer(request, request_length));
 char reply[max_length];
    boost::asio::streambuf response;
    size_t reply_length = boost::asio::read_until(_socket, response, '\n');
    std::istream response_stream(&response);
    std::string http_version;
    response_stream >> http_version;
 QMessageBox::information(this, tr("echo"), tr(http_version.c_str()));
}

qt_boost::~qt_boost()
{
 
}

问题:输入中文传回来是乱码,需要改进以支持unicode,网上说需要安装icu库,还没有测试.下一步将tcp服务端代码移到QT下.

代码改进:

void qt_boost::pbSendMessageClicked()
{
 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 request[max_length];
 QByteArray ba = this->ui.leMessage->text().toLatin1();
 memcpy(request, ba.data(), ba.size());
 request[ba.size()] = '\n';
 size_t request_length = ba.size() + 1;
 boost::asio::write(_socket, boost::asio::buffer(request, request_length));
 char reply[max_length];
 size_t reply_length = _socket.read_some(boost::asio::buffer(reply, max_length));
 QMessageBox::information(this, tr("echo"), QString(reply));
}

接收代码改为使用_socket.read_some成员函数,可以避免中间含有空格而被截断的情况.

解决中文乱码:

在main函数的第一行代码前插入:QTextCodec::setCodecForTr(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));设置tr()的字符集为本地字符集.

从QString转换为QByteArray变量时使用toLocal8Bit()成员函数,接收后也使用fromLocal8Bit静态成员函数将字符数组转化为QString.

void qt_boost::pbSendMessageClicked()
{
 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 request[max_length];
 QByteArray ba = this->ui.leMessage->text().toLocal8Bit();
 memcpy(request, ba.data(), ba.size());
 request[ba.size()] = '\n';
 size_t request_length = ba.size() + 1;
 boost::asio::write(_socket, boost::asio::buffer(request, request_length));
 char reply[max_length];
 size_t reply_length = _socket.read_some(boost::asio::buffer(reply, max_length));
 QMessageBox::information(this, tr("你好"), QString::fromLocal8Bit(reply, reply_length));
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值