这里写目录标题
前言
网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.10.1。
1.TCP服务端
1.1 QT中TCP服务器的开发思路
1、开启服务器开启端口服务:建立QTcpServer对象,并用其中的listen()
方法就可以开启指定的端口。
tcpServer->listen(QHostAddress::Any,ui->lineEdit_port->text().toUInt()); //服务器对端口号进行监听
2、当有客户端连接到服务器时,系统会接收到newConnection
信号,所以需要在对应的槽函数中获取用于通信的套接字(QTcpServer的nextPendingConnection()函数获取套接字)。
tcpSocket = tcpServer->nextPendingConnection(); //获取与客户端进行通信的套接字
3、客户端有数据过来,则会产生一个readyRead
信号,从对应的槽函数中通过套接字的readAll()
等相关函数读取数据。
buf = QString(tcpSocket->readAll()); //用套接字读取客户端发来的数据
4、通过套接字的write()
函数向客户端发送数据。
tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());
备注:ui界面控件名称可能和下述.h/.cpp代码中不一致,原理一样
1.2 QT中TCP服务器的界面设计
1.3 QT中TCP服务器的代码实现
1)在pro文件中添加一行内容:QT += network
2).h头文件
#ifndef QTSERVER_H
#define QTSERVER_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
namespace Ui {
class QtServer;
}
class QtServer : public QMainWindow
{
Q_OBJECT
public:
explicit QtServer(QWidget *parent = 0);
~QtServer();
private slots:
void on_setListen_clicked();
void on_sendMsg_clicked();
private:
Ui::QtServer *ui;
QTcpServer *m_s;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // QTSERVER_H
3).cpp文件
#include "qtserver.h"
#include "ui_qtserver.h"
QtServer::QtServer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QtServer)
{
ui->setupUi(this);
//创建监听的服务器对象
ui->port->setText("8899");
setWindowTitle(QString("Server"));
m_s=new QTcpServer(this);
//启动监听
connect(m_s,&QTcpServer::newConnection,this,[=]()
{
m_tcp= m_s->nextPendingConnection();
m_status->setPixmap(QPixmap(":/connect.jpg").scaled(20,20));
//检测是否可以接收数据
connect(m_tcp,&QTcpSocket::readyRead,this,[=]()
{
QByteArray data=m_tcp->readAll();
ui->record->append("客户端say:"+data);
});
connect(m_tcp,&QTcpSocket::disconnected,this,[=]()
{
m_tcp->close();
m_tcp->deleteLater();//delete m_tcp
m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
});
});
//状态栏
m_status=new QLabel;
m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
ui->statusBar->addWidget(new QLabel("连接状态: "));
ui->statusBar->addWidget(m_status);
}
QtServer::~QtServer()
{
delete ui;
}
void QtServer::on_setListen_clicked()
{
unsigned short port=ui->port->text().toUShort();
m_s->listen(QHostAddress::Any,port);
ui->setListen->setDisabled(true);
}
void QtServer::on_sendMsg_clicked()
{
QString msg=ui->msg->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("服务器say:"+msg);
}
2.TCP客户端
2.1 QT中TCP客户端的开发思路
1、创建QTcpSocket对象,并用connectToHost()函数通过IP和端口号连接服务器。
tcpSocket = new QTcpSocket(this);
tcpSocket->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_port->text().toUInt()); //根据IP地址和端口号连接服务器
2、客户端成功连接上服务器,系统会产生connected信号。(所以需要将信号和槽函数进行绑定)
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot())); //客户端连接服务器成功后会产生connected信号
3、客户端收到服务器发送来的数据,会产生readyRead信号,在connected信号对应的槽函数中,将readyRead信号和对应的槽函数进行绑定。
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //和服务器连接成功后,就需要就收服务器发送过来的数据了,
4、通过套接字对象读取服务器发来的数据。(用readall()等函数)
tcpSocket->readAll(); //从套接字中读取服务器发来的数据
5、通过套接字向服务器发送数据。(用write()函数)
tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data()); //向服务器发送数据
2.2 QT中TCP客户端的界面设计
2.3 QT中TCP客户端的代码实现
1)在pro文件中添加一行内容:QT += network
2).h头文件
#ifndef QTSERVER_H
#define QTSERVER_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>
#include <QLabel>
namespace Ui {
class QtServer;
}
class QtServer : public QMainWindow
{
Q_OBJECT
public:
explicit QtServer(QWidget *parent = 0);
~QtServer();
private slots:
void on_sendMsg_clicked();
void on_connect_clicked();
void on_disconnect_clicked();
private:
Ui::QtServer *ui;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // QTSERVER_H
3).cpp文件
#include "qtserver.h"
#include "ui_qtserver.h"
QtServer::QtServer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QtServer)
{
ui->setupUi(this);
//创建监听的服务器对象
ui->port->setText("8899");
ui->ip->setText("127.0.0.1");
setWindowTitle(QString("Client"));
ui->disconnect->setDisabled(true);
m_tcp =new QTcpSocket(this);
//检测是否可以接收数据
connect(m_tcp,&QTcpSocket::readyRead,this,[=]()
{
QByteArray data=m_tcp->readAll();
ui->record->append("服务器say:"+data);
});
connect(m_tcp,&QTcpSocket::disconnected,this,[=]()
{
m_tcp->close();
m_tcp->deleteLater();//delete m_tcp
m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
ui->record->append("服务器和客户端断开了连接...");
ui->connect->setDisabled(false);
ui->disconnect->setEnabled(false);
});
connect(m_tcp,&QTcpSocket::connected,this,[=]()
{
m_status->setPixmap(QPixmap(":/connect.jpg").scaled(20,20));
ui->record->append("已经连接成功了服务器...");
ui->connect->setDisabled(true);
ui->disconnect->setEnabled(true);
});
//状态栏
m_status=new QLabel;
m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
ui->statusBar->addWidget(new QLabel("连接状态: "));
ui->statusBar->addWidget(m_status);
}
QtServer::~QtServer()
{
delete ui;
}
void QtServer::on_sendMsg_clicked()
{
QString msg=ui->msg->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("客户端say:"+msg);
}
void QtServer::on_connect_clicked()
{
QString ip=ui->ip->text();
unsigned short port =ui->port->text().toUShort();
m_tcp->connectToHost(QHostAddress(ip),port);
}
void QtServer::on_disconnect_clicked()
{
m_tcp->close();
ui->connect->setDisabled(false);
ui->disconnect->setEnabled(false);
}
效果图
附工程源文件下载链接
https://download.csdn.net/download/China_Rocky/88293223