Qt怎么实现简单的TCP通信(qt,tcp,开发技术)

时间:2024-04-28 00:21:14 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

希望大家仔细阅读,能够学有所成!

使用QT的网络套接字需要.pro文件中加入一句:

QT += network

一、客户端

1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:

(1)创建QTcpSocket套接字对象

socket=newQTcpSocket();

(2)使用这个对象连接服务器

socket->connectToHost(IP,port);

(3)使用write函数向服务器发送数据

socket->write(data);

(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);

voidMainWindow::socket_Read_Data()
{
QByteArraybuffer;
//读取缓冲区数据
buffer=socket->readAll();
}

(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)

socket->disconnectFromHost();

2、以下是客户端的例程

首先是mainwindow.h文件:

//mainwindow.h

ifndefMAINWINDOW_H

defineMAINWINDOW_H

include<QMainWindow>

include<QTcpSocket>

namespaceUi{
classMainWindow;
}

classMainWindow:publicQMainWindow
{
Q_OBJECT

public:
explicitMainWindow(QWidget*parent=0);
~MainWindow();

privateslots:

voidon_pushButton_Connect_clicked();

voidon_pushButton_Send_clicked();

voidsocket_Read_Data();

voidsocket_Disconnected();

private:
Ui::MainWindowui;
QTcpSocket
socket;
};

endif//MAINWINDOW_H

然后是mainwindow.cpp文件:

//mainwindow.cpp

include"mainwindow.h"

include"ui_mainwindow.h"

MainWindow::MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi::MainWindow)
{
ui->setupUi(this);

socket=newQTcpSocket();

//连接信号槽
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("8765");

}

MainWindow::~MainWindow()
{
deletethis->socket;
deleteui;
}

voidMainWindow::on_pushButton_Connect_clicked()
{
if(ui->pushButton_Connect->text()==tr("连接"))
{
QStringIP;
intport;

//获取IP地址
IP=ui->lineEdit_IP->text();
//获取端口号
port=ui->lineEdit_Port->text().toInt();

//取消已有的连接
socket->abort();
//连接服务器
socket->connectToHost(IP,port);

//等待连接成功
if(!socket->waitForConnected(30000))
{
qDebug()<<"Connectionfailed!";
return;
}
qDebug()<<"Connectsuccessfully!";

//发送按键使能
ui->pushButton_Send->setEnabled(true);
//修改按键文字
ui->pushButton_Connect->setText("断开连接");
}
else
{
//断开连接
socket->disconnectFromHost();
//修改按键文字
ui->pushButton_Connect->setText("连接");
ui->pushButton_Send->setEnabled(false);
}
}

voidMainWindow::on_pushButton_Send_clicked()
{
qDebug()<<"Send:"<<ui->textEdit_Send->toPlainText();
//获取文本框内容并以ASCII码形式发送
socket->write(ui->textEdit_Send->toPlainText().toLatin1());
socket->flush();
}

voidMainWindow::socket_Read_Data()
{
QByteArraybuffer;
//读取缓冲区数据
buffer=socket->readAll();
if(!buffer.isEmpty())
{
QStringstr=ui->textEdit_Recv->toPlainText();
str+=tr(buffer);
//刷新显示
ui->textEdit_Recv->setText(str);
}
}

voidMainWindow::socket_Disconnected()
{
//发送按键失能
ui->pushButton_Send->setEnabled(false);
//修改按键文字
ui->pushButton_Connect->setText("连接");
qDebug()<<"Disconnected!";
}

最后是ui的设计:

Qt怎么实现简单的TCP通信

二、服务器

1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:

(1)创建QTcpSever对象

server=newQTcpServer();

(2)侦听一个端口,使得客户端可以使用这个端口访问服务器

server->listen(QHostAddress::Any,port);

(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问

connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);

voidMainWindow::server_New_Connect()
{
//获取客户端连接
socket=server->nextPendingConnection();
}

(4)使用socket的write函数向客户端发送数据

socket->write(data);

(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);

voidMainWindow::socket_Read_Data()
{
QByteArraybuffer;
//读取缓冲区数据
buffer=socket->readAll();
}

(6)取消侦听

server->close();

2、以下是服务器的例程

首先是mainwindow.h文件:

//mainwindow.h

ifndefMAINWINDOW_H

defineMAINWINDOW_H

include<QMainWindow>

include<QTcpServer>

include<QTcpSocket>

namespaceUi{
classMainWindow;
}

classMainWindow:publicQMainWindow
{
Q_OBJECT

public:
explicitMainWindow(QWidget*parent=0);
~MainWindow();

privateslots:
voidon_pushButton_Listen_clicked();

voidon_pushButton_Send_clicked();

voidserver_New_Connect();

voidsocket_Read_Data();

voidsocket_Disconnected();

private:
Ui::MainWindowui;
QTcpServer
server;
QTcpSocket*socket;
};

endif//MAINWINDOW_H

然后是mainwindow.cpp文件:

#include"mainwindow.h"

include"ui_mainwindow.h"

MainWindow::MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi::MainWindow)
{
ui->setupUi(this);

ui->lineEdit_Port->setText("8765");
ui->pushButton_Send->setEnabled(false);

server=newQTcpServer();

//连接信号槽
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
}

MainWindow::~MainWindow()
{
server->close();
server->deleteLater();
deleteui;
}

voidMainWindow::on_pushButton_Listen_clicked()
{
if(ui->pushButton_Listen->text()==tr("侦听"))
{
//从输入框获取端口号
intport=ui->lineEdit_Port->text().toInt();

//监听指定的端口
if(!server->listen(QHostAddress::Any,port))
{
//若出错,则输出错误信息
qDebug()<<server->errorString();
return;
}
//修改按键文字
ui->pushButton_Listen->setText("取消侦听");
qDebug()<<"Listensucceessfully!";
}
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);
}

}

voidMainWindow::on_pushButton_Send_clicked()
{
qDebug()<<"Send:"<<ui->textEdit_Send->toPlainText();
//获取文本框内容并以ASCII码形式发送
socket->write(ui->textEdit_Send->toPlainText().toLatin1());
socket->flush();
}

voidMainWindow::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()<<"AClientconnect!";
}

voidMainWindow::socket_Read_Data()
{
QByteArraybuffer;
//读取缓冲区数据
buffer=socket->readAll();
if(!buffer.isEmpty())
{
QStringstr=ui->textEdit_Recv->toPlainText();
str+=tr(buffer);
//刷新显示
ui->textEdit_Recv->setText(str);
}
}

voidMainWindow::socket_Disconnected()
{
//发送按键失能
ui->pushButton_Send->setEnabled(false);
qDebug()<<"Disconnected!";
}

最后是ui的设计:

Qt怎么实现简单的TCP通信

三、运行结果

Qt怎么实现简单的TCP通信

本文:Qt怎么实现简单的TCP通信的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:php数组如何检测指定索引是否存在下一篇:

12 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18