目录
1、相关的库和类
2、一些常用的API
3、帖子用到的完整核心代码:
1、相关的库和类
Qt下使用tcp协议,需要在工程的pro文件中添加:
QT += network
需要添加network网络库之后,才可以使用对应的类
客户端的类头文件:
#include <QTcpSocket>
服务端的类头文件:
#include <QTcpServer>
2、一些常用的API
客户端相关:
连接服务器:connectToHost
virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
有两种写法,但是前2个参数都是目标计算机的IP、Port,其他值可以不屑,都是有缺省值的
如:
在头文件中添加 指针成员:
QTcpSocket *m_client;
在构造函数中就可以直接初始化,然后调用connectToHost来连接服务器:
m_client = new QTcpSocket(this); m_client->connectToHost("127.0.0.1",8898);
判断有没有连接上,可以使用 waitForConnected,默认等待30秒
if(m_client->waitForConnected()){ qDebug()<<"conn ok"; }else{ qDebug()<<"conn fail"<<m_client->errorString(); }
连接之后,就需要收包,发包的处理:
发包函数:write,有3种写法,第三种其实相当于第一种,不过使用了内联来处理,使得调用的时候,更加方便
qint64 write(const char *data, qint64 len); qint64 write(const char *data); inline qint64 write(const QByteArray &data) { return write(data.constData(), data.size()); }
使用的时候,可以在按钮槽里面直接发送内容:
void TcpMainWindow::on_pushButton_clicked() { char buffer[] = "码蚁软件欢迎您"; qDebug()<<m_client->write(buffer,sizeof(buffer)); }
收包函数: read、readAll
qint64 read(char *data, qint64 maxlen); QByteArray read(qint64 maxlen);QByteArray readAll();
一般在读取数据之前,都会简单判断一下是否有数据可读,用到函数
bytesAvailable,返回长度大于0,表示有数据可读
virtual qint64 bytesAvailable() const;
由于Qt中的收包是异步非阻塞的,还得需要配合收包信号来处理一下才可以,需要自定义槽来配合信号处理收包
收包信号:
void readyRead();
自定义一个槽函数来处理:
如:
void myRead(); // 收包槽
就可以在构造函数里面,连接上服务端之后,关联收包信号和自定义收包槽:
connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));
最后,就可以在任何想要发包的地方,使用对象来调用write函数发包即可;
下一篇再把服务端部分也给简单整理一下。
3、帖子用到的完整核心代码:
完整代码下载地址:
点我下载
头文件:
#ifndef TCPMAINWINDOW_H
#define TCPMAINWINDOW_H#include <QMainWindow>
#include <QTcpSocket>namespace Ui {
class TcpMainWindow;
}class TcpMainWindow : public QMainWindow
{Q_OBJECTpublic:explicit TcpMainWindow(QWidget *parent = 0);~TcpMainWindow();private slots:void myRead(); // 收包槽函数void on_pushButton_clicked();private:Ui::TcpMainWindow *ui;QTcpSocket *m_client;};#endif // TCPMAINWINDOW_H
源文件:
#include "tcpmainwindow.h"
#include "ui_tcpmainwindow.h"
#include <QDebug>TcpMainWindow::TcpMainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::TcpMainWindow)
{ui->setupUi(this);m_client = new QTcpSocket(this);m_client->connectToHost("127.0.0.1",8898);if(m_client->waitForConnected()){qDebug()<<"conn ok";connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));}else{qDebug()<<"conn fail"<<m_client->errorString();}
}TcpMainWindow::~TcpMainWindow()
{delete ui;
}void TcpMainWindow::myRead()
{QByteArray buffer = m_client->readAll();qDebug()<<buffer;// 只是简单的打印输出,还没有做解包处理
}void TcpMainWindow::on_pushButton_clicked()
{char buffer[] = "码蚁软件欢迎您";qDebug()<<m_client->write(buffer,sizeof(buffer));
}