全是自我理解,如有错误的地方可留言提示,谢谢!
开发工具:QT Creator
前提:
1.创建两个项目:server client
2.在两个项目的.pro文件中添加network
QT += core gui network
socket原理:
server端
1.server端创建QTcpServer对象,绑定地址和端口
2.启动监听,接收客户连接请求
3.接收到客户端连接请求后,获得此次连接的新套接字,建立了连接
4.通过套接字进行相互通信
5.关闭套接字
client端
1.创建套接字
2.向服务器发送请求
3.和server进行通信
4.关闭套接字
代码:
以下代码仅支持一对一,多个客户端连接同一个服务器时,server需创建
QList<QTcpSocket*> socketList用以保存每个接入的客户端套接字
server端
.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:
void on_bt_enter_clicked();
void new_connect();
private:
Ui::Widget *ui;
QTcpServer *server;
QTcpSocket *socket;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("Server");
server = new QTcpServer(this);
server->listen(QHostAddress::Any, 8080);
connect(server, &QTcpServer::newConnection, this, &Widget::new_connect);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_bt_enter_clicked()
{
QString str = ui->send_mess->text();
socket->write(str.toUtf8());
}
void Widget::new_connect()
{
//获取套接字
socket = server->nextPendingConnection();
ui->lb_conn->setText("连接成功");
connect(socket, &QTcpSocket::readyRead, this ,[=](){
QString data = socket->readAll();
ui->receive_mess->setText(data);
});
connect(socket, &QTcpSocket::disconnected, this, [=](){
ui->lb_conn->setText("无连接");
socket->close();
socket->deleteLater();
});
}
client端
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void readMessage();
void on_bt_conn_clicked();
void on_bt_disconn_clicked();
void on_bt_send_clicked();
void on_bt_all_clicked();
void on_bt_clear_clicked();
private:
Ui::Widget *ui;
QTcpSocket *socket;
QList<QString> DataList;
QString message;
quint16 blockSize;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle("Client");
socket = new QTcpSocket(this);
ui->le_ip->setText("127.0.0.1");
ui->le_port->setText("8080");
connect(socket, &QTcpSocket::readyRead, this, &Widget::readMessage);
connect(socket,&QTcpSocket::disconnected, this, [=](){
ui->lb_conn->setText("断开连接");
});
connect(socket, &QTcpSocket::connected, this,[=](){
ui->lb_conn->setText("已连接");
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::readMessage()
{
QString message=socket->readAll();
DataList.push_back(message);
ui->le_receive->setText(message);
}
void Widget::on_bt_conn_clicked()
{
socket->connectToHost(ui->le_ip->text(),
ui->le_port->text().toInt());
}
void Widget::on_bt_disconn_clicked()
{
socket->disconnectFromHost();
}
void Widget::on_bt_send_clicked()
{
QString str = ui->le_send->text();
socket->write(str.toUtf8());
}
void Widget::on_bt_all_clicked()
{
QString str;
for (auto mess:DataList){
str += mess + '\n';
}
QMessageBox::information(nullptr, "信息", str);
}
void Widget::on_bt_clear_clicked()
{
DataList.clear();
QMessageBox::information(nullptr, "信息", "已清空");
}
效果图
参考博客
Qt 基于TCP的Socket编程 – 一杯清酒邀明月 – 博客园 (cnblogs.com)
今天的文章QT socket网络编程分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28497.html