使用QT的网络套接字需要.pro文件中加入一句:
QT += network
客户端
- 创建QTcpSocket套接字对象
socket = new QTcpSocket();
- 使用这个对象连接服务器
socket->connectToHost(IP, port);
- 使用write函数向服务器发送数据
socket->write(data);
- 当socket接收缓冲区有新数据到来时,会发出readyRead()信号,因此为该信号添加槽函数以读取数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();}
- 断开与服务器的连接
socket->disconnectFromHost();
mainwindow.h文件
//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTcpSocket>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_Connect_clicked(); //连接按钮槽函数void on_pushButton_Send_clicked(); //发送数据槽函数void socket_Read_Data(); //读数据槽函数void socket_Disconnected(); //断开连接槽函数private:Ui::MainWindow *ui;QTcpSocket *socket;};#endif // MAINWINDOW_H
mainwindow.cpp文件
//mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);socket = new QTcpSocket();//连接信号槽QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);ui->pushButton_Send->setEnabled(false);ui->lineEdit_IP->setText("127.0.0.1");ui->lineEdit_Port->setText("8080");}MainWindow::~MainWindow(){delete this->socket;delete ui;}void MainWindow::on_pushButton_Connect_clicked(){if(ui->pushButton_Connect->text() == tr("连接")){QString IP;int port;//获取IP地址IP = ui->lineEdit_IP->text();//获取端口号port = ui->lineEdit_Port->text().toInt();//取消已有的连接socket->abort();//连接服务器socket->connectToHost(IP, port);//等待连接成功if(!socket->waitForConnected(30000)){qDebug() << "Connection failed!";return;}qDebug() << "Connect successfully!";//发送按键使能ui->pushButton_Send->setEnabled(true);//修改按键文字ui->pushButton_Connect->setText("断开连接");}else{//断开连接socket->disconnectFromHost();//修改按键文字ui->pushButton_Connect->setText("连接");ui->pushButton_Send->setEnabled(false);}}void MainWindow::on_pushButton_Send_clicked(){qDebug() << "Send: " << ui->textEdit_Send->toPlainText();//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_Send->toPlainText().toLatin1());socket->flush();}void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText();str+=tr(buffer);//刷新显示ui->textEdit_Recv->setText(str);}}void MainWindow::socket_Disconnected(){//发送按键失能ui->pushButton_Send->setEnabled(false);//修改按键文字ui->pushButton_Connect->setText("连接");qDebug() << "Disconnected!";}
最终成品

服务端
服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:- 创建QTcpSever对象
server = new QTcpServer();
- 侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port);
- 当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);void MainWindow::server_New_Connect(){//获取客户端连接socket = server->nextPendingConnection();}
- 使用socket的write函数向客户端发送数据
socket->write(data);
- 当socket接收缓冲区有新数据到来时,会发出readyRead()信号,因此为该信号添加槽函数以读取数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();}
- 取消侦听
server->close();
mainwindow.h文件
//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTcpServer>#include <QTcpSocket>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_Listen_clicked();void on_pushButton_Send_clicked();void server_New_Connect();void socket_Read_Data();void socket_Disconnected();private:Ui::MainWindow *ui;QTcpServer* server;QTcpSocket* socket;};#endif // MAINWINDOW_H
mainwindow.cpp文件
#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->lineEdit_Port->setText("8765");ui->pushButton_Send->setEnabled(false);server = new QTcpServer();//连接信号槽connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);}MainWindow::~MainWindow(){server->close();server->deleteLater();delete ui;}void MainWindow::on_pushButton_Listen_clicked(){if(ui->pushButton_Listen->text() == tr("侦听")){//从输入框获取端口号int port = ui->lineEdit_Port->text().toInt();//监听指定的端口if(!server->listen(QHostAddress::Any, port)){//若出错,则输出错误信息qDebug()<<server->errorString();return;}//修改按键文字ui->pushButton_Listen->setText("取消侦听");qDebug()<< "Listen succeessfully!";}else{/*//如果正在连接(点击侦听后立即取消侦听,若socket没有指定对象会有异常,应修正——2017.9.30)if(socket->state() == QAbstractSocket::ConnectedState){//关闭连接socket->disconnectFromHost();}*/socket->abort();//取消侦听server->close();//修改按键文字ui->pushButton_Listen->setText("侦听");//发送按键失能ui->pushButton_Send->setEnabled(false);}}void MainWindow::on_pushButton_Send_clicked(){qDebug() << "Send: " << ui->textEdit_Send->toPlainText();//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_Send->toPlainText().toLatin1());socket->flush();}void MainWindow::server_New_Connect(){//获取客户端连接socket = server->nextPendingConnection();//连接QTcpSocket的信号槽,以读取新数据QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);//发送按键使能ui->pushButton_Send->setEnabled(true);qDebug() << "A Client connect!";}void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText();str+=tr(buffer);//刷新显示ui->textEdit_Recv->setText(str);}}void MainWindow::socket_Disconnected(){//发送按键失能ui->pushButton_Send->setEnabled(false);qDebug() << "Disconnected!";}

