使用QT的网络套接字需要.pro文件中加入一句:
QT += network
一、客户端
1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:
(1)创建QTcpSocket套接字对象
socket = new QTcpSocket();
(2)使用这个对象连接服务器
socket->connectToHost(IP, port);
(3)使用write函数向服务器发送数据
socket->write(data);
(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
- 1
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); - 2
- 3
void MainWindow::socket_Read_Data() - 4
{ - 5
QByteArray buffer; - 6
//读取缓冲区数据 - 7
buffer = socket->readAll(); - 8
}
(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)
socket->disconnectFromHost();
2、以下是客户端的例程
首先是mainwindow.h文件:
- 1
//mainwindow.h - 2
#ifndef MAINWINDOW_H - 3
#define MAINWINDOW_H - 4
- 5
#include <QMainWindow> - 6
#include <QTcpSocket> - 7
- 8
namespace Ui { - 9
class MainWindow; - 10
} - 11
- 15
然后是mainwindow.cpp文件:
- 1
//mainwindow.cpp - 2
#include "mainwindow.h" - 3
#include "ui_mainwindow.h" - 4
- 5
MainWindow::MainWindow(QWidget *parent) : - 6
QMainWindow(parent), - 7
ui(new Ui::MainWindow) - 8
{ - 9
ui->setupUi(this); - 10
- 11
socket = new QTcpSocket(); - 15
QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
最后是ui的设计:
二、服务器
1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:
(1)创建QTcpSever对象
server = new QTcpServer();
(2)侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port);
(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
- 1
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect); - 2
- 3
void MainWindow::server_New_Connect() - 4
{ - 5
//获取客户端连接 - 6
socket = server->nextPendingConnection(); - 7
}
(4)使用socket的write函数向客户端发送数据
socket->write(data);
(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
- 1
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); - 2
- 3
void MainWindow::socket_Read_Data() - 4
{ - 5
QByteArray buffer; - 6
//读取缓冲区数据 - 7
buffer = socket->readAll(); - 8
}
(6)取消侦听
server->close();
2、以下是服务器的例程
首先是mainwindow.h文件:
- 1
//mainwindow.h - 2
#ifndef MAINWINDOW_H - 3
#define MAINWINDOW_H - 4
- 5
#include <QMainWindow> - 6
#include <QTcpServer> - 7
#include <QTcpSocket> - 8
- 9
namespace Ui { - 10
class MainWindow; - 11
} - 15
Q_OBJECT
然后是mainwindow.cpp文件:
- 1
#include "mainwindow.h" - 2
#include "ui_mainwindow.h" - 3
- 4
MainWindow::MainWindow(QWidget *parent) : - 5
QMainWindow(parent), - 6
ui(new Ui::MainWindow) - 7
{ - 8
ui->setupUi(this); - 9
- 10
ui->lineEdit_Port->setText("8765"); - 11
ui->pushButton_Send->setEnabled(false); - 15
//连接信号槽
最后是ui的设计:
三、运行结果
以上是根据这几天学习总结出的基于QT5的TCP通信的简单实现,如有错误希望能指出,欢迎各位多多交流!