基于QT的多线程server
// thread.cpp
#include "thread.h"
Thread::Thread(int socketDescriptor, QObject *parent)
: QThread(parent)
{
m_socketDescriptor = socketDescriptor;
}
Thread::~Thread()
{
}
void Thread::run()
{
m_tcpSocket = new QTcpSocket;
if (!m_tcpSocket->setSocketDescriptor(m_socketDescriptor))
{
emit error(m_tcpSocket->error());
return;
}
connect(m_tcpSocket,SIGNAL(readyRead()),this, SLOT(readData_slot()), Qt::DirectConnection); // Qt::DirectConnection线程内传递消
connect(m_tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(tcpSocket_error_slot()));
connect(m_tcpSocket,SIGNAL(disconnected()),this,SLOT(quit()));//socket断开连接。线程退出
qDebug() << "run" << m_tcpSocket->peerAddress().toString();
qDebug() << "run" << m_tcpSocket->peerPort();
exec();
}
void Thread::readData_slot()
{
QDataStream in(m_tcpSocket);
in.setVersion(QDataStream::Qt_5_0);
QDataStream out(m_tcpSocket);
out.setVersion(QDataStream::Qt_5_0);
QString data;
in >> data;
qDebug() << "readData_slot" << data;
data = "hello this is server";
out << data;
qDebug() << data;
}
void Thread::tcpSocket_error_slot()
{
qDebug() << m_tcpSocket->errorString();
}
// server.cpp
#include "server.h"
Server::Server(QObject *parent)
: QTcpServer(parent)
{
}
Server::~Server()
{
}
void Server::incomingConnection(qintptr socketDescriptor)
{
Thread *thread = new Thread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
// dialog.cpp
#include "dialog.h"
Dialog::Dialog(QWidget *parent)
: QWidget(parent)
{
m_statusLabel = new QLabel;
m_statusLabel->setWordWrap(true);
m_quitButton = new QPushButton(tr("Quit"));
m_quitButton->setAutoDefault(false);
QString ipAddress;
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
// use the first non-localhost IPv4 address
for (int i=0; i <ipAddressesList.size(); ++i)
{
if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
ipAddressesList.at(i).toIPv4Address())
{
ipAddress = ipAddressesList.at(i).toString();
break;
}
}
// if we did not find one, use IPv4 localhost
if (ipAddress.isEmpty())
{
ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
}
m_statusLabel->setText(tr("The server is running on\n\nIP: %1\nport: %2\n\n"
"Run the Client example now.")
.arg(ipAddress).arg(m_server.serverPort()));
connect(m_quitButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(m_quitButton);
buttonLayout->addStretch(1);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(m_statusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
setWindowTitle(tr("Threaded Server"));
if (!m_server.listen(QHostAddress::Any, 1314))
{
QMessageBox::critical(this, tr("Threaded Server"),
tr("Unable to start the server: %1.")
.arg(m_server.errorString()));
close();
return;
}
}
Dialog::~Dialog()
{
}
这是我參照http://m.blog.csdn.net/blog/sdu_sky/8104175这位大神的博客和QT的多线程server源代码写出来的,
可是我又两个地方不明确,在dialog.cpp中
if (!m_server.listen(QHostAddress::Any, 1314))
这一句如何就能在监听成功之后创建一个新的线程。
void Server::incomingConnection(qintptr socketDescriptor)还有这个函数没有在构造函数里实现。也没有显式的调用???这是怎么回事。望高手指导
基于QT的多线程server的更多相关文章
- Qt搭建多线程Server
起因是MySQL在Android上没有驱动.也就是说,移动端想要访问远程数据库,必须通过一台(或多台)PC进行中转. 中转PC作为Server,接受来自移动端Socket访问数据库的要求,Server ...
- 一种基于Qt的可伸缩的全异步C/S架构server实现(一) 综述
本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/Sclient-服务集群应用需求而搭建. 连接监听.传输数据.数据处理均在独立的线程池中进行,依据特定任务不同,可安排负责监听.传输.处理 ...
- <基于Qt与POSIX线程>多线程下载器的简易搭建
原创博客,转载请联系博主! 本项目已托管到本人Git远程库:https://github.com/yue9944882/Snow 项目目标 Major Functionality 开发环境: Ce ...
- 基于Libevent的HTTP Server
简单的Http Server 使用Libevent内置的http相关接口,可以很容易的构建一个Http Server,一个简单的Http Server如下: #include <event2/e ...
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)
本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...
- 基于tcp和多线程的多人聊天室-C语言
之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...
- key-value 多线程server的Linux C++实现
项目需求 整体思路 网络通信 字符解析 数据存储与查询 1 存储管理 2 数据查询 多线程 待改进未实现的想法 GitHub源代码 项目需求 设计一个基于Socket或基于HTTP的server,服务 ...
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...
- 基于I/O的Server/Client实现
在前面的文章中讲了基于NIO实现的Server/Client.本文就讲讲基于同步堵塞式I/O实现的Server/Client好与前面的NIO中的Server/Client进行对照. 网络编程中须要解决 ...
随机推荐
- j建立一个小的servlet小程序
我们建立一个最简单的servlet程序,这个servelt程序只是单纯的输出helloworld. 步骤如下:如图:在Eclipse中选择新建一个项目,其中选择tomcat project然后点击下一 ...
- Codeforces 612D 前缀和处理区间问题
传送门:http://codeforces.com/problemset/problem/612/D (转载请注明出处谢谢) 题意: 给出数字n和k,n表示接下来将输入n个在x轴上的闭区间[li,ri ...
- RabbitMQ~一些术语和最消息的生产
学习一种技术需要先了解它,而想要学好一种技术,需要更多的了解它的组成,原理和实现机制! RabbitMQ安装介绍 RabbitMQ是由erlang语言开发的,所以必须先有安装erlang,类似java ...
- Java—解压zip文件
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...
- phpstorm如何在同一个文件夹打开多个目录
phpstorm默认一个窗口只显示一个项目,如果新建一个项目,他会给你个选项卡,问你是在新窗口打开新项目还是在本窗口打开. 能不能在一个窗口打开多个项目呢?就像sublime text那样,其实是可以 ...
- fcc 响应式框架Bootstrap 练习2
text-primary 属性值使标题直接变成了红色,text-center使标题直接居中 <h2 class="text-primary text-center"> ...
- webstorm中配置过visualsvn,后面做更改要更换authentication realm的解决办法
找这个找了好久,一直改不过来,终于找到了解决办法 首先,在提交代码时提示: 但是我的authentication realm已经时这个了,并且账号和密码也改了,所以要更改authentication ...
- UI开发模式对比:JSP、Android、Flex
前一篇文章分析了Java平台下不同类型WEB框架对开发模式的影响,多数Java领域的WEB框架都是聚焦于服务端MVC的实现,这些框架对View的支持,通常是基于标准的JSP或类似JSP的模板技术如Fr ...
- [Windows Server 2008] Serv-U安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Serv- ...
- JavaScript定时器及其他
By Abyssly Jun 20 2014 Updated:Jun 20 2014 平时工作中不可避免地要嵌套网页,对JavaScript的深入了解还是很有必要滴.而JavaScript中一个容易让 ...