首先我们建立socket客户端,在创建客户端前,我们需要将.pro文件中链接上network。
如下:
代码运行如下:
QT中的TCP
、
完成客户端窗口时 ,我们需要先在堆区建立一个通信套接字
tcpSoket = new QTcpSocket(this); //创建通信对象
然后我们可以调用connect函数连接我们的服务器连接信号,用来提醒我们完成服务器的连接
connect(tcpSoket,&QTcpSocket::connected,[=]{ ui->textEdit->setText(QString("已成功连接上服务器")); });
做完这些,我们就要使用我们在qt中设置的按键了
我们首先在connect这个按钮设立槽函数,将我们的端口号与ip地址连接到服务器
//连接
void MainWindow::on_pushButton_clicked()
{
if(nullptr == ui->lineEdit||
nullptr == ui->lineEdit_2){
qDebug() << "错误:端口号或ip地址为空";
return;
}
QString str = ui->lineEdit->text();
qint16 port = ui->lineEdit_2->text().toInt();
//通信套接字,通过协议栈触发
tcpSoket->connectToHost(str,port);}
将我们的端口号将ip地址和端口号发送出去进行连接,直接通过协议栈发送。
连接完成后我们就可以进行信息的发送,设置sendbuf按钮的槽函数
void MainWindow::on_pushButton_2_clicked()
{
//如果通信套接字为空,不给予通信流程
if(nullptr == tcpSoket){
return;
}
QString str = ui->textEdit->toPlainText();
tcpSoket->write(str.toUtf8().data());
ui->textEdit->clear();
}
我们使用toPlainText()函数将文本内容进行读取,通过write函数将我们的信息发出,注意发出时我们需要将str的类型转换为char类型便于服务器的读取。
还有我们的断开连接功能 设置disconnect按钮的槽函数
void MainWindow::on_pushButton_3_clicked()
{
if(nullptr == tcpSoket){
return;
}
tcpSoket->disconnectFromHost();
tcpSoket->close();
tcpSoket = nullptr;
}
使用disconnectFromHost();函数将其断开连接并关闭我们的套接字
代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QDebug>
#include <QByteArray>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket * tcpSoket;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTcpSocket>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
tcpSoket = nullptr;
tcpSoket = new QTcpSocket(this); //创建通信对象
setWindowTitle("socket客户端");
connect(tcpSoket,&QTcpSocket::connected,[=]{
ui->textEdit->setText(QString("已成功连接上服务器"));
});
connect(tcpSoket,&QTcpSocket::readyRead,[=]{
QByteArray array = tcpSoket->readAll();
ui->textEdit->append(array);
});
}
MainWindow::~MainWindow()
{
delete ui;
}
//连接
void MainWindow::on_pushButton_clicked()
{
if(nullptr == ui->lineEdit||
nullptr == ui->lineEdit_2){
qDebug() << "错误:端口号或ip地址为空";
return;
}
QString str = ui->lineEdit->text();
qint16 port = ui->lineEdit_2->text().toInt();
//通信套接字,通过协议栈触发
tcpSoket->connectToHost(str,port);
}
void MainWindow::on_pushButton_2_clicked()
{
//如果通信套接字为空,不给予通信流程
if(nullptr == tcpSoket){
return;
}
QString str = ui->textEdit->toPlainText();
tcpSoket->write(str.toUtf8().data());
ui->textEdit->clear();
}
void MainWindow::on_pushButton_3_clicked()
{
if(nullptr == tcpSoket){
return;
}
tcpSoket->disconnectFromHost();
tcpSoket->close();
tcpSoket = nullptr;
}