通常情况下Qt如果需要建立网络通信则必须依附于图形界面,但如果是新手入门,图形界面则显得太过于繁琐不利于学习原理,如下本人实现了命令行版本的网络通信案例,能够让读者更好的理解Qt是如何创建网络通信套接字的。

实现简单的结构体传输

服务端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream> struct MyStruct
{
char uname[7];
qint32 id;
}; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); MyStruct ptr;
QTcpServer server; server.listen(QHostAddress::Any,9000);
server.waitForNewConnection(100000); QTcpSocket *socket; socket = server.nextPendingConnection();
while(socket->state() && QAbstractSocket::ConnectedState)
{
socket->waitForReadyRead(1000);
socket->read((char*)&ptr,sizeof(MyStruct));
std::cout << ptr.uname << std::endl; socket->write((char *)"sz",sizeof("sz"));
} socket->close();
server.close();
return a.exec();
}

客户端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream> struct MyStruct
{
char uname[7];
qint32 id;
}; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QTcpSocket socket; MyStruct ptr = {"abc",1001}; socket.connectToHost(QHostAddress::LocalHost,9000); while(socket.state() && QAbstractSocket::ConnectedState)
{
socket.waitForConnected();
socket.write((char *)&ptr,sizeof(MyStruct)); socket.waitForBytesWritten();
socket.waitForReadyRead(10000); char sz_ref[1024]={0}; QByteArray qb = socket.readAll(); QString str;
str.prepend(qb);
std::cout << str.toStdString() << std::endl;
} socket.close();
return a.exec();
}

实现简单传递字符串

客户端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream> int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); QTcpSocket socket;
socket.connectToHost(QHostAddress::LocalHost,9000); if(socket.state() && QAbstractSocket::ConnectedState)
{
socket.waitForReadyRead(10000); QByteArray ref = socket.readAll(); QString ref_string; ref_string.prepend(ref); std::cout << ref_string.toStdString() << std::endl;
} socket.close();
return a.exec();
}

服务端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream> struct MyStruct
{
char uname[7];
qint32 id;
}; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); MyStruct ptr;
QTcpServer server; server.listen(QHostAddress::Any,9000);
server.waitForNewConnection(100000); QTcpSocket *socket; socket = server.nextPendingConnection();
if(socket->state() && QAbstractSocket::ConnectedState)
{
QString str = "abcde";
QByteArray bytes = str.toUtf8();
socket->write(bytes.data(),bytes.length());
} socket->close();
server.close();
return a.exec();
}

简单通信框架

服务端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream> int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTcpServer server; server.listen(QHostAddress::Any,9000);
server.waitForNewConnection(100000); QTcpSocket *socket; socket = server.nextPendingConnection();
if(socket->state() && QAbstractSocket::ConnectedState)
{
// 获取CPU数据
QString str = "GetCPU";
QByteArray bytes = str.toUtf8();
socket->write(bytes.data(),bytes.length()); // 接收返回结果
socket->waitForReadyRead(10000);
QByteArray ref = socket->readAll();
QString ref_buffer(ref);
std::cout << "返回结果: " << ref_buffer.toStdString() << std::endl;
} socket->close();
server.close();
return a.exec();
}

客户端

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <iostream>
#include <QString> int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTcpSocket socket; while(1)
{
// 循环链接服务器
socket.connectToHost(QHostAddress::LocalHost,9000); // 循环接收数据包,并处理请求
while(socket.state() && QAbstractSocket::ConnectedState)
{
socket.waitForReadyRead(10000); // 将字节序转为字符串
QByteArray ref = socket.readAll();
QString ref_string(ref); if( (QString::compare(ref_string,"GetCPU")) == 0)
{
std::cout << "获取CPU数据" << std::endl; QString str = "94%";
QByteArray bytes = str.toUtf8();
socket.write(bytes.data(),bytes.length());
}
else if( QString::compare(ref_string,"GetMemory") == 0)
{
std::cout << "ref memory" << std::endl;
}
else if( QString::compare(ref_string,"GetLoadAvg") == 0)
{
std::cout << "ref load avg" << std::endl;
}
}
} socket.close();
return a.exec();
}

C/C++ Qt 命令行版网络通信的更多相关文章

  1. Python 实现有道翻译命令行版

    一.个人需求 由于一直用Linux系统,对于词典的支持特别不好,对于我这英语渣渣的人来说,当看英文文档就一直卡壳,之前用惯了有道词典,感觉很不错,虽然有网页版的但是对于全站英文的网页来说并不支持.索性 ...

  2. 安装appium桌面版和命令行版

    一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: 2.直接点击紫色图标即可打开   3.启动server 二  命令行版(打开很快,常用于执行脚本) 1.jdk 安装jdk并 ...

  3. appium桌面版和命令行版的安装

    一.appium桌面版: 启动很慢,一般用于元素定位 Appium-Desktop官方下载地址:https://github.com/appium/appium-desktop/releases/ ( ...

  4. Windows下安装appium桌面版和命令行版

    安装appium桌面版和命令行版   一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本:  github search appium desktop download late ...

  5. GitBook制作电子书详细教程(命令行版)

    GitBook 是一款基于 Node.js 开发的开源的工具,可以通过命令行的方式创建电子书项目,再使用 MarkDown 编写电子书内容,然后生成 PDF.ePub.mobi 格式的电子书,或生成一 ...

  6. Shell终端收听音乐--网易云音乐命令行版

    Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写. 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式 ...

  7. Centos 7 命令行版虚拟机安装

    使用VMware创建虚拟机 点击下一步 点击下一步 下一步 选择你要安装的虚拟机是哪种操作系统 选择虚拟机的安装位置 选择处理器 自定义内存 选择网络 下一步 下一步 下一步就可以 自定义磁盘容量 然 ...

  8. Linux常用命令(第二版) --网络通信命令

    网络通信命令 1.write /usr/bin/write 格式: write [用户名] #用于向用户发送信息,前提是这个用户已经登录到了这台服务器主机,不然的话,也没有办法给他留言,所以,writ ...

  9. Shell终端收听音乐--豆瓣FM命令行版

    douban.fm Terminal-based douban.fm inspired by douban.fm.该版本版基于Python2.* 安装Python2.* pacman -S pytho ...

  10. foobar2000实现用手机远程控制PC命令行版

    实现此功能主要是在手机上使用Telnet命令实现下一首播放. 1.安装Telnet守护进程插件:http://www.foobar2000.org/components/view/foo_telnet ...

随机推荐

  1. SpringBoot 项目实战 | 瑞吉外卖 Day01

    一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...

  2. vue学习笔记 十七、父子组件 ---> 子组件传值

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  3. P1616-DP【橙】

    这道题好几天前就写出了记搜代码,但是理论上空间恰好够,实际上不论是用new-delete还是malloc-free,都有1~2个点MLE了(最抽象的是一开始MLE两个点,我把数组两个下标调换顺序后理应 ...

  4. P3844【黄】

    这道题做的极其折磨 因为最开始小看这道题了,没用稳扎稳打的码风来写代码,直接用的那种可读性极差但勉强能跑的代码写的,最后没AC只有73分调了好久也没调对,甚至逐渐调成了64.55越来越低的分.这有多方 ...

  5. C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别

    刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype() 识别值类别:lvalue glvalue xvalue rvalue prvalue.依照博客的方法试了一下,发现根本行不通. ...

  6. 物联网浏览器(IoTBrowser)-简单介绍

    物联网浏览器(IoTBrowser)是用于开发人机界面(HMI)或数据采集与监督控制系统(SCADA) 的工具,使用HTML或Vue前端技术开发物联网终端用户界面,支持串口.RFID.电子秤等硬件协议 ...

  7. css - 隐藏body滚动条

    body::-webkit-scrollbar{ display: none; }

  8. Go-发送邮件

    1. 邮件 - mail From -- 发送者(这封邮件由谁进行发送的,一般都是该邮件的作者) To -- 邮件的接收者(发送邮件的人希望谁能收到邮件) Subject -- 邮件的主题(类似文章的 ...

  9. [转帖]Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?

    文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...

  10. [转帖]总结:shell中的if条件判断

    一.if 的基本语法 if [ command ];then xxx elif [ command ];then xxx else xxx fi 二.常见的一些写法案例 1.if [ "x$ ...