1. 相关类继承关系
- 文件操作类都继承自QAbstractSocket,我们主要用QTcpServer 和QTcpSocket 进行编程。 类比文件操作,打开,读,写,关闭。
- Qt提供了QTcpSocket类(封装了TCP协议细节)
- 直接将QTcpSocket的对象当做黑盒使用,进行数据 传输
- QTcpSocket的使用方式:
- 链接服务端主机 connetToHost()
- 发送数据 /接收数据 write() /read()
- 关闭连接 close()
2. 同步编程
QtTcpSocket默认是使用异步编程,但是Qt也提供了辅助函数也可以完成同步编程。
#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>
void SyncClientDemo()
{
QTcpSocket client;
char buf[256]={0};
client.connectToHost("127.0.0.1",8000); //指定要连接的远程主机的地址,这个IP表示本机
qDebug()<<"Conneted:"<<client.waitForConnected();
//QThread::sleep(5);
qDebug()<<"Send Bytes:"<<client.write("hello world!");
qDebug()<<"Send Status:"<<client.waitForBytesWritten();
qDebug()<<"Data Available:"<<client.waitForReadyRead();
qDebug()<<"Received Bytes:"<<client.read(buf,sizeof(buf)-1);
qDebug()<<"Received Data"<<buf;
client.close();
client.waitForDisconnected();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SyncClientDemo();
return a.exec();
}
3.异步编程
- QTcpSocket对象通过发送信号的方式返回操作结果
- 可以再程序中将对应信号连接到槽函数,获取结果
- Qt默认使用的是异步编程,应用程序中通常使用QTcpSocket的异步方式
- QTCPSocket中的关键信号
connected():成功连接到远端主机
disconnected():远端主机断开连接
readyRead():远端数据到达本机
bytesWritten(qint64):数据成功发送到系统
clientdemo.c
#include "clientdemo.h"
#include <QHostAddress>
#include <QDebug>
ClientDemo::ClientDemo(QObject *parent) : QObject(parent)
{
connect(&m_client,SIGNAL(connected()),this,SLOT(onConneted()));
connect(&m_client,SIGNAL(disconnected()),this,SLOT(onDisConneted()));
connect(&m_client,SIGNAL(readyRead()),this,SLOT(onDataRady()));
connect(&m_client,SIGNAL(bytesWritten(qint64)),this,SLOT(onBytesWritten(qint64)));
}
void ClientDemo::onConneted()
{
qDebug()<<"onConneted()";
qDebug()<<"Local Address"<<m_client.localAddress();
qDebug()<<"Local Port"<<m_client.localPort();
}
void ClientDemo::onDisConneted()
{
qDebug()<<"onDisconneted()";
}
void ClientDemo::onDataRady()
{
char buf[256]={0};
qDebug()<<"onDataRady()"<<m_client.read(buf,sizeof(buf)-1);
qDebug()<<"Data:"<<buf;
}
void ClientDemo::onBytesWritten(qint64 bytes)
{
qDebug()<<"onBytesWritten()"<<bytes;
}
void ClientDemo::connectTo(QString ip,int port)
{
m_client.connectToHost(ip,port);
}
qint64 ClientDemo::send(const char* data,int len)
{
return m_client.write(data,len);
}
qint64 ClientDemo::available()
{
return m_client.bytesAvailable();
}
void ClientDemo::close()
{
m_client.close();
}
clientdemo.h
#ifndef CLIENTDEMO_H
#define CLIENTDEMO_H
#include <QObject>
#include <QTcpSocket>
class ClientDemo : public QObject //因为用到信号与槽继承这个类
{
Q_OBJECT
QTcpSocket m_client;
public:
explicit ClientDemo(QObject *parent = nullptr);
protected slots:
void onConneted();
void onDisConneted();
void onDataRady();
void onBytesWritten(qint64 bytes);
public:
void connectTo(QString ip,int port);
qint64 send(const char* data,int len);
qint64 available();
void close();
};
#endif // CLIENTDEMO_H
int main(int argc, char *argv[])
{
char data[]="hello world!!!";
QCoreApplication a(argc, argv);
ClientDemo client;
client.connectTo("127.0.0.1",8000);
client.send(data,sizeof(data)-1);
return a.exec();
}