#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 新建TCP套接字类
tcpServer=new QTcpServer(this);
// 连接信号初始化其他信号
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
}
MainWindow::~MainWindow()
{
delete ui;
}
// 初始化信号槽函数
void MainWindow::onNewConnection()
{
// 创建新套接字
tcpSocket = tcpServer->nextPendingConnection();
// 连接触发信号
connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
onClientConnected();
// 关闭触发信号
connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));
// 状态改变触发信号
connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
onSocketStateChange(tcpSocket->state());
// 读入数据触发信号
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}
// Socket状态变化时
void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{
switch(socketState)
{
case QAbstractSocket::UnconnectedState:
ui->plainTextEdit->appendPlainText("Scoket状态:UnconnectedState");
break;
case QAbstractSocket::HostLookupState:
ui->plainTextEdit->appendPlainText("Scoket状态:HostLookupState");
break;
case QAbstractSocket::ConnectingState:
ui->plainTextEdit->appendPlainText("Scoket状态:ConnectingState");
break;
case QAbstractSocket::ConnectedState:
ui->plainTextEdit->appendPlainText("Scoket状态:ConnectedState");
break;
case QAbstractSocket::BoundState:
ui->plainTextEdit->appendPlainText("Scoket状态:BoundState");
break;
case QAbstractSocket::ClosingState:
ui->plainTextEdit->appendPlainText("Scoket状态:ClosingState");
break;
case QAbstractSocket::ListeningState:
ui->plainTextEdit->appendPlainText("Scoket状态:ListeningState");
}
}
// 客户端接入时
void MainWindow::onClientConnected()
{
ui->plainTextEdit->appendPlainText("[*] 客户端进入");
ui->plainTextEdit->appendPlainText(" IP地址:"+ tcpSocket->peerAddress().toString());
ui->plainTextEdit->appendPlainText(" Port端口:"+QString::number(tcpSocket->peerPort()));
}
// 客户端断开连接时
void MainWindow::onClientDisconnected()
{
ui->plainTextEdit->appendPlainText("[-] 客户端断开");
tcpSocket->deleteLater();
}
// 读取缓冲区行文本
void MainWindow::onSocketReadyRead()
{
while(tcpSocket->canReadLine())
ui->plainTextEdit->appendPlainText("[接收] | " + tcpSocket->readLine());
}
// 开始侦听
void MainWindow::on_pushButton_2_clicked()
{
// 此处指定绑定本机的8888端口
tcpServer->listen(QHostAddress::LocalHost,8888);
ui->plainTextEdit->appendPlainText("[+] 开始监听");
ui->plainTextEdit->appendPlainText(" 服务器地址:" + tcpServer->serverAddress().toString() +
" 服务器端口:"+QString::number(tcpServer->serverPort())
);
}
// 停止侦听
void MainWindow::on_pushButton_3_clicked()
{
if (tcpServer->isListening())
{
tcpServer->close();
}
}
// 发送数据
void MainWindow::on_pushButton_clicked()
{
QString msg=ui->lineEdit->text();
ui->plainTextEdit->appendPlainText("[发送] | " + msg);
QByteArray str=msg.toUtf8();
str.append('\n');
tcpSocket->write(str);
}
QTcpSocket.zip
需积分: 0 150 浏览量
更新于2024-03-13
收藏 7KB ZIP 举报
在C++编程领域,Qt库是一个非常强大的框架,它提供了丰富的功能来构建跨平台的应用程序。QTcpSocket是Qt网络模块中的一个关键组件,专用于处理TCP(传输控制协议)网络通信。本节我们将深入探讨QTcpSocket及其在网络编程中的应用。
QTcpSocket是一个基于异步事件驱动的类,它允许我们创建客户端应用程序,与运行在相同或不同机器上的服务器进行双向数据传输。使用QTcpSocket,开发者可以轻松地实现基于TCP的网络服务,如HTTP、FTP等。
要使用QTcpSocket,首先需要包含必要的头文件并引入Qt的网络模块:
```cpp
#include <QTcpSocket>
#include <QHostAddress>
#include <QByteArray>
#include <QDataStream>
#include <QNetworkConfigurationManager>
```
然后,我们可以创建一个QTcpSocket实例,并连接到目标服务器:
```cpp
QTcpSocket *socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::connected, this, &MyClass::onConnected);
connect(socket, &QTcpSocket::disconnected, this, &MyClass::onDisconnected);
connect(socket, static_cast<void(QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error), this, &MyClass::onError);
QHostAddress serverAddress("127.0.0.1"); // 或其他服务器地址
quint16 portNumber = 8888; // 或其他端口号
socket->connectToHost(serverAddress, portNumber);
```
当`QTcpSocket::connected`信号被触发时,表明已成功建立连接,此时可以开始发送和接收数据。QTcpSocket通常配合QDataStream使用,以方便地序列化和反序列化数据:
```cpp
QDataStream out(socket);
out << "Hello, Server!"; // 发送字符串
QDataStream in(socket);
in >> receivedData; // 接收数据
```
为了确保数据完整,我们需要检查QTcpSocket的状态和错误信息。例如,通过监听`QTcpSocket::readyRead`信号,可以在有新数据可读时进行处理:
```cpp
connect(socket, &QTcpSocket::readyRead, this, &MyClass::onReadyRead);
```
同时,我们还需要处理可能发生的错误,如网络中断或服务器关闭:
```cpp
void MyClass::onError(QAbstractSocket::SocketError error)
{
switch (error) {
case QAbstractSocket::RemoteHostClosedError:
qDebug() << "远程主机关闭";
break;
case QAbstractSocket::NetworkError:
qDebug() << "网络错误";
break;
// 其他错误情况...
default:
qDebug() << "未知错误:" << socket->errorString();
}
}
```
在完成通信后,记得关闭连接以释放资源:
```cpp
socket->disconnectFromHost();
socket->deleteLater();
```
QTcpSocket还支持SSL/TLS加密,对于需要安全传输敏感数据的应用场景,可以通过`QTcpSocket::setSocketOption`设置QAbstractSocket::SslConfigurationOption来启用。
总结来说,QTcpSocket是Qt库提供的一个强大工具,用于处理TCP网络通信。通过使用它,开发者可以轻松构建可靠的客户端网络应用,实现数据的可靠传输。了解并熟练掌握QTcpSocket的使用,将极大地提升C++开发者在网络编程领域的技能。

山月照空舟
- 粉丝: 6w+
最新资源
- 毕设&课设:基于django twisted的 计划任务-后台任务调度项目.zip
- 毕设&课设:基于django+vue实现的一套前后端分离的运维系统.zip
- 毕设&课设:基于Django搭建的音乐播放网页.zip
- 毕设&课设:基于django的admin后台管理系统.zip
- 毕设&课设:基于Django的python信息管理系统,用于酒店预订管理.zip
- 毕设&课设:基于django的AI对战游戏运行平台.zip
- 毕设&课设:基于django的alertmanager告警接口,可以实现简单的告警推送,告警记录.zip
- 毕设&课设:基于django的毕业设计管理系统..zip
- 毕设&课设:基于Django的RustDesk Api&Web Server,除了支持api所有功能,还支持we.zip
- 毕设&课设:基于Django的大数据管理平台.zip
- 毕设&课设:基于Django的定点景点及酒店推荐预订系统.zip
- 毕设&课设:基于django的美食分享网站.zip
- 毕设&课设:基于Django的简单学生成绩管理系统,实现了学生登录查分以及教师登录录入成绩.zip
- 毕设&课设:基于Django的设备管理系统.zip
- 毕设&课设:基于Django的轻量级生产环境接口监控平台.zip
- 毕设&课设:基于Django的私有云盘.zip