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();
}
文章出处:https://www.cnblogs.com/LyShark/p/15407428.html
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2020-10-14 C/C++ BeaEngine 反汇编引擎