帮帮我 很难弄啊 qt 多线程 tcp

liyingju001 2013-09-16 11:40:36
废话少说,服务器是lamp,用qt写的监听端口程序,dtu是设定好的,往服务器这个ip的某个端口主动发起连接时候,服务器怎么能监听到,监听到了以后从我的数据库里面读取传感器的id和要发送的命令,因为传感器很多,也就是dtu很多,最好用多线程是吧?并且要求发送采集的命令几乎要同一时间发出,以保证得到的数据也是同一时间的,我觉得这要用多线程。然后继续监听端口,传感器会接到命令后自动返回采集的数据,服务器怎么监听呢?监听后写到数据库。有大侠给指点一二,或者哪有开源的代码(有点不好意思啊)??
...全文
280 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyingju001 2013-10-04
  • 打赏
  • 举报
回复
引用 3 楼 ppdayz 的回复:
Qt官方的例子: Fortune Server Example 简单的说就是Qt封装了一个QTcpServer的类,用这个玩意就可以了,十分的方便
void ForwardServer::incomingConnection(int socketDescriptor)
{
    ForwardLink *link = new ForwardLink(socketDescriptor);
    connect(this, SIGNAL(serverSendLogMSG(QByteArray)), link, SLOT(receiveAndSendLog(QByteArray)));
 
    QThread *thread = new QThread(this);
    link->moveToThread(thread);
 
    connect(link, SIGNAL(destroyed()), thread, SLOT(quit()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), link, SLOT(deleteLater()));
 
    thread->start();
}
这个是我根据Fortune Server Example这个例子写的一个多线程tcp server, 自己只要实现ForwardLink 就行,接收数据什么的都在ForwardLink 这个类里面完成, 每当一个新的连接要进来,就会new 一个ForwardLink,然后塞到一个线程里面。 server要做的事情就是管理好这些ForwardLink 和线程就可以了。 具体的事情就让ForwardLink来做,这样维护也很方便。 至于版本的问题,估计是你看的接收到的数据的处理吧,设置版本是为了让Qt可以正确处理不用的版本生成的二进制,而你这个数据是自己写的,就不用这么的麻烦,只需要处理好粘包就可以。
if(m_sensor.getSenorValue(m_pkgBuf,val,temp )==true) { qDebug()<<"val"<<val<<endl;//此时还是得到的数值 例如是129 query.prepare("INSERT INTO ib_data_bridge2 (value) VALUES (?)"); query.addBindValue("val");//但是数据库的插入的数值是0 为什么呢 query.exec(); query.clear(); }
ppdayz 2013-09-17
  • 打赏
  • 举报
回复
Qt官方的例子: Fortune Server Example 简单的说就是Qt封装了一个QTcpServer的类,用这个玩意就可以了,十分的方便
void ForwardServer::incomingConnection(int socketDescriptor)
{
    ForwardLink *link = new ForwardLink(socketDescriptor);
    connect(this, SIGNAL(serverSendLogMSG(QByteArray)), link, SLOT(receiveAndSendLog(QByteArray)));
 
    QThread *thread = new QThread(this);
    link->moveToThread(thread);
 
    connect(link, SIGNAL(destroyed()), thread, SLOT(quit()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), link, SLOT(deleteLater()));
 
    thread->start();
}
这个是我根据Fortune Server Example这个例子写的一个多线程tcp server, 自己只要实现ForwardLink 就行,接收数据什么的都在ForwardLink 这个类里面完成, 每当一个新的连接要进来,就会new 一个ForwardLink,然后塞到一个线程里面。 server要做的事情就是管理好这些ForwardLink 和线程就可以了。 具体的事情就让ForwardLink来做,这样维护也很方便。 至于版本的问题,估计是你看的接收到的数据的处理吧,设置版本是为了让Qt可以正确处理不用的版本生成的二进制,而你这个数据是自己写的,就不用这么的麻烦,只需要处理好粘包就可以。
liyingju001 2013-09-17
  • 打赏
  • 举报
回复
哦 dtu只要一上电就主动给服务器发一个数据包,包含id等信息,只需要解析就可以了,不用那么麻烦
liyingju001 2013-09-16
  • 打赏
  • 举报
回复
我看很多案例,有的是服务器和客户端都是qt,会设置版本,但是我这发出的时候是给dtu或者是传感器,这个还需要设定版本吗?

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧