目录
一.widget.ui界面设计
拖拽左侧Label控件到页面中,分别显示Label:服务器;Label:客户端地址;Label:客户端窗口号;Label:收到的信息。
拖拽左侧Line Edit控件到页面中,在右侧将其objectName 设置为"ipLineEdit"; "portLineEdit"; "mainLineEdit",目的是显示客户端地址和客户端端口号和收到的信息。
二.创建TCP通信
1.pro文件添加network模块。
2.添加对应头文件
#include <QTcpSocket>:QTcpSocket 是 Qt Network 模块的一部分,它提供了一个 TCP(Transmission Control Protocol)客户端和服务器的接口,用于在应用程序中进行网络通信,如创建套接字、发送和接收数据、处理连接和断开等。
#include <QTcpServer>:QTcpServer
类用于创建TCP服务器,允许您监听和处理传入的TCP连接请求。
3.定义槽函数
void newClientHandler();
:这个函数用来处理新连接的客户端,需要创建一个新线程来处理客户端的请求。
4.定义类的私有成员
QTcpServer *server;
定义了一个QTcpServer
类型的指针,用于创建和管理TCP服务器。
5.定义服务器监听的端口
6.监听TCP端口
server = new QTcpServer;
:创建一个新的QTcpServer
对象,用于创建和管理TCP服务器。
server->listen(QHostAddress::AnyIPv4,PORT);
:调用listen
函数,开始监听TCP端口,允许客户端连接。
connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);
:使用Qt
的信号和槽机制,在客户端发起连接时,调用newClientHandler
函数。
7.建立TCP连接
通过server->nextPendingConnection()
建立了一个TCP连接,并将返回的QTcpSocket
指针存储在socket
中。
使用socket->peerAddress()
和socket->peerPort()
分别获取了客户端的IP地址和端口号。
8.效果图
三.代码演示
1.h头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#define PORT 8000
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
// Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QTcpServer *server;
private slots:
void newClientHandler();
};
#endif // WIDGET_H
2.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
server = new QTcpServer;
server->listen(QHostAddress::AnyIPv4,PORT);
//客户端发起连接,server发出信号
connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);
}
Widget::~Widget()
{
delete ui;
}
void Widget::newClientHandler()
{
//建立tcp连接
QTcpSocket *socket = server->nextPendingConnection();
socket->peerAddress(); //获取客户端的地址
socket->peerPort(); //获取客户端的端口号
ui->ipLineEdit->setText(socket->peerAddress().toString());
ui->portLineEdit->setText(QString::number(socket->peerPort()));
}