QTcpSocket网络通讯多客户端功能
首先声明此文章为学习Qt的网络通讯找的例子,仅供学习用,以下为自己总结,原作者的连接如下:GitHub - manfredipist/QTcpSocket: A simple Qt client-server TCP architecture to transfer data between peersA simple Qt client-server TCP architecture to transfer data between peers - GitHub - manfredipist/QTcpSocket: A simple Qt client-server TCP architecture to transfer data between peershttps://github.com/manfredipist/QTcpSocket
解决的问题:
在学习网络通讯时,Qt给你封装好了QTcpSocket类,来进行网络套接字通讯,经常会有需求进行一对多的功能,一台服务器,对多台客户端的开发,应用到实践中
如何实现:
实现分为:1、客户端 Client
2、服务器端 Server
约定的数据格式头
fileType:attachment 、 message
QString("fileType:message,fileName:null,fileSize:%1;").arg(str.size()).toUtf8()
代码块解析:
客户端 Client
.h文件
//1:读数据
void readSocket();
//2:断开连接
void discardSocket();
//3:错误连接
void displayError(QAbstractSocket::SocketError socketError);
//4:发送数据
void sendMessage();
.cpp文件
//1:连接
socket->connectToHost(QHostAddress::LocalHost,8080);//2:读取数据在readyRead槽下
void MainWindow::readSocket()
{QByteArray buffer;QDataStream socketStream(socket);socketStream.setVersion(QDataStream::Qt_5_7);socketStream.startTransaction();socketStream >> buffer;QString header = buffer.mid(0,128);QString fileType = header.split(",")[0].split(":")[1];buffer = buffer.mid(128);if(fileType=="attachment"){//TODO}else if(fileType=="message"){//TODOQString message = QString("%1 :: %2").arg(socket->socketDescriptor()).arg(QString::fromStdString(buffer.toStdString()));}
}//3:发送数据
void Mainindow::sendMessage()
{//1:组装数据QString str = ui->lineEdit_message->text();QDataStream socketStream(socket);socketStream.setVersion(QDataStream::Qt_5_7);QByteArray header;header.prepend(QString("fileType:message,fileName:null,fileSize:%1;").arg(str.size()).toUtf8());header.resize(128);//2:发送数据的包封装方式QByteArray byteArray = str.toUtf8();byteArray.prepend(header);//3:数据发送socketStream << byteArray;
}
服务器端 Server
1:监听端口
m_server = new QTcpServer();
m_server->listen(QHostAddress::Any, 8080)
2:当有客户端client连接时,发出newConnection 信号,由于要进行多客户端功能,得把客户端给存起来
void MainWindow::appendToSocketList(QTcpSocket* socket)
{connection_set.insert(socket);connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readSocket);connect(socket, &QTcpSocket::disconnected, this, &MainWindow::discardSocket);connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));ui->comboBox_receiver->addItem(QString::number(socket->socketDescriptor()));displayMessage(QString("INFO :: Client with sockd:%1 has just entered the room").arg(socket->socketDescriptor()));
}void MainWindow::newConnection()
{while (m_server->hasPendingConnections())appendToSocketList(m_server->nextPendingConnection());
}
3:readSocket()功能与客户端client一致,唯一区别,打印的时候,带上了客户端连接的唯一标识:socket->socketDescriptor
4:reinterpret_cast<>用法将sender()转换成socket对象
reinterpret_cast与static_cast_云之舟_的博客-CSDN博客_reinterpret_cast
5:分发消息的机制
void MainWindow::sendMessage(QTcpSocket* socket)
{if(socket){if(socket->isOpen()){QString str = ui->lineEdit_message->text();QDataStream socketStream(socket);socketStream.setVersion(QDataStream::Qt_5_7);QByteArray header;header.prepend(QString("fileType:message,fileName:null,fileSize:%1;").arg(str.size()).toUtf8());header.resize(128);QByteArray byteArray = str.toUtf8();byteArray.prepend(header);socketStream.setVersion(QDataStream::Qt_5_7);socketStream << byteArray;}elseQMessageBox::critical(this,"QTCPServer","Socket doesn't seem to be opened");}elseQMessageBox::critical(this,"QTCPServer","Not connected");
}void MainWindow::on_pushButton_sendMessage_clicked()
{QString receiver = ui->comboBox_receiver->currentText();if(receiver=="Broadcast"){foreach (QTcpSocket* socket,connection_set){sendMessage(socket);}}else{foreach (QTcpSocket* socket,connection_set){if(socket->socketDescriptor() == receiver.toLongLong()){sendMessage(socket);break;}}}ui->lineEdit_message->clear();
}
QTcpSocket网络通讯多客户端功能相关推荐
- php网络通讯,Linux_网络通讯--efax,功能说明:收发传真。
语 - phpStudy
网络通讯--efax 功能说明:收发传真. 语 法:efax [-sw][-a][-c][-d][-f][-g][-h][-i][-j][-k][-l][-o][-q][-r][-v][-x][-t] ...
- Linux命令大全(四)(详解)网络通讯、电子邮件与新闻组及其他
9. linux网络通讯命令 dip 功能说明:IP拨号连接. 语 法:dip [-aikltv][-m<MTU数目>][-p<协议>][拨号script文件] 补充说明:di ...
- 客户端程序初步加入网络通讯的功能
文章目录 1 客户端初步加入网络通讯的功能 1.1 设计方案 1.2 代码实现 1 客户端初步加入网络通讯的功能 1.1 设计方案 在主窗口类中使用客户端类: 初步设计方案: 主窗口通过ClientD ...
- 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]
开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...
- Zookeeper客户端网络通讯模型分析
前言: 之前的Zookeeper系列文章中有分析过客户端如何发送具体的增删改查节点请求. 这些文章的分析都是偏业务层面的.如今回想起来,还是不知道该如何回答接下来的问题: Zookeeper客户端的网 ...
- 玩转iPhone网络通讯之BSD Socket篇
玩转iPhone网络通讯之BSD Socket篇 编辑文档 在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket,不 ...
- C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示) 作者:一点一滴的Beer http://beer.cnblogs.com/ 在程序设计中,涉及数据存储和数据交换的时候 ...
- 网络编程2_网络通讯协议, socket(tcp, udp)
一. 网络通讯协议 互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准 互联网协议按照功能的不同分为osi七层或tcp/ip五层 ...
- android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...
软件项目实训及课程设计指导--如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例 1.基于TCP/IP协议的Socket通信相关的基础知识 (1)TCP/IP(Transmissi ...
- .NET(C#)基于Socket编程实现平行主机之间网络通讯有图片传输的Demo演示
本文讲下C#通过Socket编程实现平行主机之间网络通讯的详细讲解,非常不错的博文,一起来看下吧. 在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式 ,都有这样一个概念 ...
最新文章
- 讯飞语音的中的bug用户校验失败
- opencv读取中文路径图片
- ionice使用说明与参数详析
- {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- 《SQL必知必会(第4版)》	02	检索数据
- [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)
- python中的__slots__
- Seata多微服务互相调用_全局分布式事物使用案例_业务数据库准备---微服务升级_SpringCloud Alibaba工作笔记0059
- 自己的包增加为第三方包,使用Eclipse环境报Unresolved import错误(pycharm可用正常引用)...
- java oracle spool,oracle之spool详细使用总结
- socks代理转http代理
- 查看Windows的激活到期时间、具体版本号等具体系统信息
- php制作600行表格,表格排版的基本操作
- Benzoic acid,4-(((diphenylamino)carbonyl)oxy)-3-nitro,2-硝基-4-羧基苯基-N,N-氨基甲酸二苯酯,2-Ncdc
- 字节跳动三场技术面+HR面,掌握这些知识点再也不怕面试通不过!
- 工业42、57、86、110步进电机
- 创造力的分类:机器学习技术在发散思维EEG数据中的应用
- qt中如何模拟按钮点击_Qt 实现按钮点击切换按钮图片
- 老计算机u盘无法启动不了怎么办,u盘无法启动怎么办 u盘无法启动解决方法【详解】...