基于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进行对照. 网络编程中须要解决 ...
随机推荐
- Codeforces 455D 分块+链表
题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...
- Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼
Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...
- [ JSOI 2015 ] Salesman
\(\\\) \(Description\) 给出一棵以\(1\)为根的\(N\)个节点的树,开始的时候你在\(1\)号节点. 除了\(1\)号节点以外,每个点都有访问次数限制\(t_i\),即到达该 ...
- css3 画小蜜蜂
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- [转]Linux下/proc目录简介
1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...
- JS——event
触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息: 普通浏览器支持 event(传参),IE678支持 window.event(无参),兼容写法: < ...
- CSS——样式隐藏
overflow:hidden: 溢出隐藏 visibility:hidden: 隐藏元素 隐藏之后还占据原来的位置. display:none: 隐藏元素 隐藏之后不占据 ...
- C# 字符串的入门
1."@"表示字符串中的"\"不当成转义符. 2.转义符或者特殊处理的一些字符只是针对于代码中直接写出的字符串中,对于程序运行中读取出来的转义符或者特殊处理的字 ...
- Linux监控实时log
https://jingyan.baidu.com/article/93f9803f5545a3e0e46f5596.html
- 【技术累积】【点】【java】【29】MapUtils
内容 是Apache组织下的commons-collections包中的工具类 <dependency> <groupId>commons-collections</gr ...