一、服务端
1.运用UI创建界面如下,并修改对应的objectname。
端口 | port |
启动服务器 | start |
通讯记录 | record |
发送数据textline | send |
发送数据 | senddata |
2.头文件
(1).pro文件中加入network
(2)
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
(3)
QTcpServer *m_s;
QTcpSocket *m_tcp;
QLabel *label;
3.源文件
(1)为区别客户端和服务端,单独设置setwindowtitle;
(2)对应变量实例化;
(3)设置端口号:8899(可以任意赋值,但需与客户端保证一致)
(4)
跳转槽函数on_start_clicked():监听
跳转槽函数on_senddata_clicked():数据获取和发送
(5)连接信号与槽
I.基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
II.如果有新的客户端连接调用 QTcpSocket *QTcpServer::nextPendingConnection() 得到通信的套接字对象
III.使用通信的套接字对象 QTcpSocket 和客户端进行通信(连接为readyread,断开为disconnected)
(6)补充
为方便检验连接状态,在new->Qt->resource file->images中添加图标来判断是否成功连接。
和
(7).c代码如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("服务器");
m_s=new QTcpServer() ;
m_tcp=new QTcpSocket();
ui->port->setText("8899");
connect(m_s,&QTcpServer::newConnection,this,[=]()
{
m_tcp=m_s->nextPendingConnection();
label->setPixmap(QPixmap(":/no1.png").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();
label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
});
});
label=new QLabel();
label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
ui->statusbar->addWidget(new QLabel("连接状态: "));
ui->statusbar->addWidget(label);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_start_clicked()
{
unsigned short port=ui->port->text().toShort();
m_s->listen(QHostAddress::Any,port);
ui->start->setDisabled(true);
}
void MainWindow::on_senddata_clicked()
{
QString msg=ui->send->toPlainText();
m_tcp->write(msg.toUtf8());
}
二、客户端
1.运用UI创建界面如下,并修改对应的objectname。
端口 | port |
ip | IP |
连接服务器 | connect |
断开连接 | disconnect |
通讯记录 | record |
发送数据信息栏 | send |
发送数据按钮 | senddata |
2.头文件
(1).pro文件中加入network
(2)
#include <QTcpSocket>
#include <QLabel>
(3)
QTcpSocket *m_tcp;
QLabel *label;
3.源文件
(1)为区别客户端和服务端,单独设置setwindowtitle;
(2)对应变量实例化,创建通信的套接字类 QTcpSocket 对象m_tcp;
(3)设置端口号:8899(可以任意赋值,但需与客户端保证一致)
ip地址,本例以本地局域网为准,127.0.0.1
使用服务器端绑定的 IP 和端口连接服务器 QAbstractSocket::connectToHost()
使用 QTcpSocket 对象和服务器进行通信
(4)
跳转槽函数void on_connect_clicked(): 与主机进行连接connectToHost 跳转槽函数void on_disconnect_clicked(): 与主机断开连接close 跳转槽函数void on_senddata_clicked():数据获取和发送
(5)连接信号与槽
readyread、disconnected、connected
(6)补充
界面中disconnect与connect为互斥关系,故在其一使能时,另一个可以关闭,比如在连接成功后,
ui->connect->setEnabled(false);
ui->disconnect->setEnabled(true);
代表连接按钮使能未开启,未连接使能开启,也就是当前为连接状态,在发送数据后只可以断开,不能再重复连接。
(7)代码如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("客户端");
ui->IP->setText("127.0.0.1");
ui->disconnect->setEnabled(true);
m_tcp=new QTcpSocket(this);
ui->port->setText("8899");
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();
label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
ui->record->append("服务器已经和客户端断开了连接");
ui->connect->setEnabled(true);
ui->disconnect->setEnabled(false);
});
connect(m_tcp,&QTcpSocket::connected,this,[=]()
{
label->setPixmap(QPixmap(":/no1.png").scaled(20,20));
ui->record->append("已经成功连接到了服务器");
ui->connect->setEnabled(false);
ui->disconnect->setEnabled(true);
});
label=new QLabel();
label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
ui->statusbar->addWidget(new QLabel("连接状态: "));
ui->statusbar->addWidget(label);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_connect_clicked()
{
QString ip=ui->IP->text();
unsigned short port=ui->port->text().toShort();
m_tcp->connectToHost(ip,port);
}
void MainWindow::on_disconnect_clicked()
{
m_tcp->close();
ui->connect->setEnabled(true);
ui->disconnect->setEnabled(false);
}
void MainWindow::on_senddata_clicked()
{
QString msg=ui->send->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("客户端say: "+msg);
}
三、运行结果