首先声明此文章为学习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网络通讯多客户端功能相关推荐

  1. php网络通讯,Linux_网络通讯--efax,功能说明:收发传真。 语  - phpStudy

    网络通讯--efax 功能说明:收发传真. 语 法:efax [-sw][-a][-c][-d][-f][-g][-h][-i][-j][-k][-l][-o][-q][-r][-v][-x][-t] ...

  2. Linux命令大全(四)(详解)网络通讯、电子邮件与新闻组及其他

    9. linux网络通讯命令 dip 功能说明:IP拨号连接. 语 法:dip [-aikltv][-m<MTU数目>][-p<协议>][拨号script文件] 补充说明:di ...

  3. 客户端程序初步加入网络通讯的功能

    文章目录 1 客户端初步加入网络通讯的功能 1.1 设计方案 1.2 代码实现 1 客户端初步加入网络通讯的功能 1.1 设计方案 在主窗口类中使用客户端类: 初步设计方案: 主窗口通过ClientD ...

  4. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]

    开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...

  5. Zookeeper客户端网络通讯模型分析

    前言: 之前的Zookeeper系列文章中有分析过客户端如何发送具体的增删改查节点请求. 这些文章的分析都是偏业务层面的.如今回想起来,还是不知道该如何回答接下来的问题: Zookeeper客户端的网 ...

  6. 玩转iPhone网络通讯之BSD Socket篇

    玩转iPhone网络通讯之BSD Socket篇 编辑文档 在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket,不 ...

  7. C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)

    C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示) 作者:一点一滴的Beer http://beer.cnblogs.com/ 在程序设计中,涉及数据存储和数据交换的时候 ...

  8. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  9. android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

    软件项目实训及课程设计指导--如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例 1.基于TCP/IP协议的Socket通信相关的基础知识 (1)TCP/IP(Transmissi ...

  10. .NET(C#)基于Socket编程实现平行主机之间网络通讯有图片传输的Demo演示

    本文讲下C#通过Socket编程实现平行主机之间网络通讯的详细讲解,非常不错的博文,一起来看下吧.      在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式 ,都有这样一个概念 ...

最新文章

  1. 讯飞语音的中的bug用户校验失败
  2. opencv读取中文路径图片
  3. ionice使用说明与参数详析
  4. {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
  5. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
  6. 《SQL必知必会(第4版)》 02 检索数据
  7. [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)
  8. python中的__slots__
  9. Seata多微服务互相调用_全局分布式事物使用案例_业务数据库准备---微服务升级_SpringCloud Alibaba工作笔记0059
  10. 自己的包增加为第三方包,使用Eclipse环境报Unresolved import错误(pycharm可用正常引用)...
  11. java oracle spool,oracle之spool详细使用总结
  12. socks代理转http代理
  13. 查看Windows的激活到期时间、具体版本号等具体系统信息
  14. php制作600行表格,表格排版的基本操作
  15. Benzoic acid,4-(((diphenylamino)carbonyl)oxy)-3-nitro,2-硝基-4-羧基苯基-N,N-氨基甲酸二苯酯,2-Ncdc
  16. 字节跳动三场技术面+HR面,掌握这些知识点再也不怕面试通不过!
  17. 工业42、57、86、110步进电机
  18. 创造力的分类:机器学习技术在发散思维EEG数据中的应用
  19. qt中如何模拟按钮点击_Qt 实现按钮点击切换按钮图片
  20. 老计算机u盘无法启动不了怎么办,u盘无法启动怎么办 u盘无法启动解决方法【详解】...

热门文章

  1. AmazeUI 图标的示例代码
  2. 工作记录软件app,可以写工作记录的便签软件
  3. 毕业季青春纪念册PPT模板
  4. 地磁计HMC5883L
  5. 对于moxie的quot;WebWork教程quot;补充 - [文件上传]
  6. MapGIS K9如何裁剪瓦片数据
  7. PS2小车—舵机基本原理
  8. Mathematica 矩阵的LU分解
  9. 我的实习和求职经验(金融)
  10. ug建模文本怎么竖着_ug模型如何雕刻立体汉字