基于Qt的SocketIO客户端实现 【一】开源代码的选择

Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。socket.io解决了实时的通信问题,适合用于消息推送、聊天程序等需要服务器端与客户端实时传输数据的环境。socket.io的官网上有一份教程,介绍了socket.io的服务器搭建以及web端的实现。那篇教程上并没有介绍除web以外的其他平台的客户端程序的写法(如C#QtAndroid等),网上有关其他平台的客户端程序也是少之又少,但是有些时候我们可能又需要使用多种平台的socket.io客户端程序。

我自己在编写基于Qtsocket.io客户端程序时,遇到了很多的问题,并且使用基于github上的开源代码编写程序时多次测试失败,但最后也是终于解决了。我想用三篇文章介绍一下我是怎么制作基于Qtsocket.io的客户端程序的,以及我的一些心得体会。

 

第一部分 开源代码的选择

 

1.首先编写socket.io的服务器端程序

服务器端程序的编写方法可以参见socket.io官网教程http://socket.io/get-started/(比较简单,大约20-30分钟就可以学会)。

我写的index.js代码如下:

var app = require('express')();

var http = require('http').Server(app);

var io = require('socket.io')(http);

 

app.get('/', function(req, res){

  res.sendfile('index.html');

});

 

http.listen(3000, function(){

  console.log('listening on *:3000');

});

 

io.on('connection', function(socket){

  console.log('A new client connected.');

  socket.on('chat message', function(msg){

    console.log('message: ' + msg);

    io.emit('chat message', msg);

  });

  socket.on('disconnect',function(){

    console.log('user disconnected.');

  });

});

服务器端程序创建了一个socket.io的服务,socket.on监听客户端的链接,emit发送数据,disconnect处理客户端断开连接的事件。

node.js等模块的安装、实现原理以及socket.io接口如何使用可以查看socket.io的官网教程http://socket.io/get-started/,这里就不多说了。

注:上面index.js的代码中有一行“res.sendfile('index.html');”,由于这篇文章主要讨论Qt客户端程序的编写而不是web端的程序制作,index.html里的内容对Qt客户端程序与服务器之间的通信也没有影响,因此index.html的内容我没有贴出。

服务器端程序完成之后,就可以编写Qt部分的客户端程序了。

特别说明:在编写Qt部分的程序之前请先查看服务器端socket.io的版本。如果按照教程http://socket.io/get-started/搭建服务器,那么服务端socket.io的版本应当为1.5.x(这很重要)

2.Qt部分开源代码的选择

当我们上网搜索Qt socket.io客户端代码的时候,我们大概能搜索到两个开源代码,链接分别为

https://github.com/KurtPattyn/QtSocketIo

https://github.com/socketio/socket.io-client-cpp

如果服务器端socket.io的版本为0.9.x,请使用第一个开源代码编写客户端程序。如果socket.io的版本为1.x,请使用第二个开源代码编写客户端程序。

socket.io0.9.x版本与1.x版本是不通用的(不通用的原因可以参见https://segmentfault.com/q/1010000002470019/a-1020000002471490)。因此,如果使用0.9.x版本的客户端向1.x版本的服务器端发起请求,将不能正常的建立连接。

3.实验说明使用第一个开源代码向1.x版本的socket.io服务器发起请求会出现错误

我们建立一个控制台工程,将这个开源代码添加到自己建立的工程中,编写main.cpp内容为

#include

#define CONNECT_URL "http://192.168.0.103:3000/"

#include "qsocketioclient.h"

 

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

 

    QSocketIoClient *client=new QSocketIoClient();

    client->open(QUrl(CONNECT_URL));

 

    return a.exec();

}

并让程序在控制台上显示QSocketIoClient::open函数中的requestUrl变量、QSocketIoClient::replyFinished函数中的statusstatusReason变量,方便调试并观察结果。

 

注:编译时qsocketioclient.cpp中的handshakeSuccessed函数可能会报错,如果报错可以修改那部分代码为

void QSocketIoClient::handshakeSucceeded()

{

    QUrl url(m_requestUrl.toString() + QStringLiteral("/socket.io/1/websocket/") + m_sessionId);

    m_pWebSocket->open(url);

}

编译时如果出现错误moc_qsocketioclient.cpp:175: error: C2491: 'QSocketIoClient::staticMetaObject': definition of dllimport static data member not allowed,可以将qsocketioclient.h的第20行由classQ_SOCKETIO_EXPORT QSocketIoClient : public QObject改为class QSocketIoClient : public QObject即可解决

 

运行后输出结果如下:

基于Qt的SocketIO客户端实现 <wbr> <wbr>【一】开源代码的选择

可以很明显的看到出现了400 Bad Request的错误

 

因此,如果socket.io服务器端版本为1.x,那么客户端的程序不能基于第一个开源代码进行编写

使用第二个开源代码(https://github.com/socketio/socket.io-client-cpp)编写socket.io客户端程序并向1.x版本服务器发送请求的方法将会在第二部分(Part 2)加以说明

 

4.参考资料

http://socket.io/blog/socket-io-cpp/

https://segmentfault.com/q/1010000002470019

http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264


原文出自:http://blog.sina.com.cn/s/blog_15d207b300102xy58.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值