本文章只实现了服务器的创建和客户端的连接的基本功能
服务器端:
当服务器启动的时候没有客户端的连接 ,当前连接数设置为0
当有客户端连接到服务器的时候服务器的当前连接数+1
当客户端退出的时候相应的将服务器端的当前连接数-1
客户端:
当客户端打开的时候需要通过连接按钮连接到服务器(也可以实现打开客户端自动连接到指定服务器)
在UI界面里添加一个QLabel用来显示客户端是否连接到服务器
在UI界面里添加按钮并且设置其文本为连接,当连接到服务器时设置按钮文本为断开,当与服务器断开连接时设置按钮文本为连接
以下是具体实现
服务器端代码
server.h代码(源代码.h文件名为widget.h)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
private:
void NewConnection();
void DisConnection();
private:
Ui::Widget *ui;
QTcpServer *server;
int counts;
};
#endif // WIDGET_H
server.cpp代码 (源代码.cpp文件名为widget.cpp)
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
counts = 0;
server = new QTcpServer(this);
server->listen(QHostAddress::Any,6666);
connect(server,&QTcpServer::newConnection,this,&Widget::NewConnection);
}
Widget::~Widget()
{
delete ui;
}
void Widget::NewConnection()
{
QTcpSocket *client = server->nextPendingConnection();
connect(client,&QTcpSocket::disconnected,this,&Widget::DisConnection);
counts++;
ui->label_2->setText(QString::number(counts));
qDebug() << "有客户端连接";
}
void Widget::DisConnection()
{
qDebug() << "有客户端离开";
if(counts > 0)
{
counts--;
}
if(counts == 0)
{
ui->label_2->setText("00000");
}else{
ui->label_2->setText(QString::number(counts));
}
}
客户端代码
client.h代码(源代码.h文件名为widget1.h)
#ifndef WIDGET1_H
#define WIDGET1_H
#include <QWidget>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget1; }
QT_END_NAMESPACE
class Widget1 : public QWidget
{
Q_OBJECT
public:
Widget1(QWidget *parent = nullptr);
~Widget1();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget1 *ui;
QTcpSocket *client;
};
#endif // WIDGET1_H
client.cpp代码(源代码.cpp文件名为widget1.cpp)
#include "widget1.h"
#include "ui_widget1.h"
#include <QDebug>
#include <QHostAddress>
Widget1::Widget1(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget1)
{
ui->setupUi(this);
client = new QTcpSocket(this);
}
Widget1::~Widget1()
{
delete ui;
}
void Widget1::on_pushButton_clicked()
{
if(ui->pushButton->text().compare("连接") == 0)
{
client->connectToHost(QHostAddress::LocalHost,6666);
ui->pushButton->setText("断开");
ui->label->setText("已连接");
}else if(ui->pushButton->text().compare("断开") == 0){
client->disconnectFromHost();
ui->pushButton->setText("连接");
ui->label->setText("未连接");
}
}
然后分别在服务器和客户端的main函数里创建各自的对象并显示
效果如下
效果演示