C/C++ Qt 命令行版网络通信
通常情况下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 命令行版网络通信的更多相关文章
- Python 实现有道翻译命令行版
一.个人需求 由于一直用Linux系统,对于词典的支持特别不好,对于我这英语渣渣的人来说,当看英文文档就一直卡壳,之前用惯了有道词典,感觉很不错,虽然有网页版的但是对于全站英文的网页来说并不支持.索性 ...
- 安装appium桌面版和命令行版
一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: 2.直接点击紫色图标即可打开 3.启动server 二 命令行版(打开很快,常用于执行脚本) 1.jdk 安装jdk并 ...
- appium桌面版和命令行版的安装
一.appium桌面版: 启动很慢,一般用于元素定位 Appium-Desktop官方下载地址:https://github.com/appium/appium-desktop/releases/ ( ...
- Windows下安装appium桌面版和命令行版
安装appium桌面版和命令行版 一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: github search appium desktop download late ...
- GitBook制作电子书详细教程(命令行版)
GitBook 是一款基于 Node.js 开发的开源的工具,可以通过命令行的方式创建电子书项目,再使用 MarkDown 编写电子书内容,然后生成 PDF.ePub.mobi 格式的电子书,或生成一 ...
- Shell终端收听音乐--网易云音乐命令行版
Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写. 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式 ...
- Centos 7 命令行版虚拟机安装
使用VMware创建虚拟机 点击下一步 点击下一步 下一步 选择你要安装的虚拟机是哪种操作系统 选择虚拟机的安装位置 选择处理器 自定义内存 选择网络 下一步 下一步 下一步就可以 自定义磁盘容量 然 ...
- Linux常用命令(第二版) --网络通信命令
网络通信命令 1.write /usr/bin/write 格式: write [用户名] #用于向用户发送信息,前提是这个用户已经登录到了这台服务器主机,不然的话,也没有办法给他留言,所以,writ ...
- Shell终端收听音乐--豆瓣FM命令行版
douban.fm Terminal-based douban.fm inspired by douban.fm.该版本版基于Python2.* 安装Python2.* pacman -S pytho ...
- foobar2000实现用手机远程控制PC命令行版
实现此功能主要是在手机上使用Telnet命令实现下一首播放. 1.安装Telnet守护进程插件:http://www.foobar2000.org/components/view/foo_telnet ...
随机推荐
- SQL Server 时间算差值/常用函数
项目中需要计算使用年限,按月份算.刚开始踩了坑,不足1年应该按1年算.记录下~ 和当前时间比较,用DATEDIFF函数DateDiff(month,比较的时间,getdate())先算出月份,再除以1 ...
- Spring Cloud 和 Dubbo 哪个会被淘汰?
今天在知乎上看到了这样一个问题:Spring Cloud 和 Dubbo哪个会被淘汰?看了几个回答,都觉得不在点子上,所以要么就干脆写篇小文瞎逼叨一下. 简单说说个人观点 我认为这两个框架大概率会长期 ...
- 灵魂拷问std::enable_shared_from_this,揭秘实现原理
参考博客: std::enable_shared_from_this原理浅析 引言 在C++编程中,使用智能指针是一种安全管理对象生命周期的方式.std::shared_ptr是一种允许多个指针共享对 ...
- POJ:1511 Invitation Cards(双向搜索最短路径)
POJ :1511 http://poj.org/problem?id=1511 思路 求1号点到其他点的最短路 + 其他点到1号点的最短. 结果用long long. 用快读可以加快时间 代码 sp ...
- Spring EL 表达式
本篇讲述了Spring Expression Language -- 即Spring3中功能丰富强大的表达式语言,简称SpEL. SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复 ...
- 类加载机制-深入理解jvm
一.什么是类的加载: 如上图,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中.其中类装载器的作用其实就是类的加载. 二.原理 (类的加载过程及其最终 ...
- 你真的懂Linux内核中的阻塞和异步通知机制吗?
@ 目录 阻塞/非阻塞简介 阻塞/非阻塞例程 等待队列简介 等待队列相关函数 定义等待队列 初始化等待队列头 定义并初始化一个等待队列项 将队列项添加到等待队列头 将队列项从等待队列头移除 等待唤醒 ...
- citespace 文献计量工具初探
先放几个教程: 知乎 - CiteSpace 使用教程 - 312 赞同 知乎 - CiteSpace 入门教程 - 949 赞同 简书 - 研究方法 | 用 CiteSpace 进行科学文献可视化分 ...
- C语言中的操作符:了解与实践
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 操作符的分类 操作符又叫运算符,它在C语言中起着非常大的作用,以下是 ...
- 【TouchGFX】Widgets and Containers
Widgets and Containers 是 TouchGFX 应用最基础的东西,他们贯穿于 UI 的整个开发,属于 TouchGFX 的预制组件,同时也支持自定义实现 Widgets Widge ...