TCP网络通信
2025-05-05 本文已影响0人
xqiiitan
1.TCP网络通信
QIODevice 基类:
↓
QAbstractSocket
↓
QTcpSocket、QUdpSocket
send--write()
recv--read()
监听:QTcpServer 不是IO设备。
通信:QTcpSocket
TCP连接,发数据。
server.listen(IP, port); // 1.服务器进入监听状态。
connectToHost(serverIP,serverPort) // 2.client 连接服务器
newConnection() //3.server收到信号
在槽函数中,接收连接请求accept()
conn = server.nextPendingConnection(); //保存client端的信息,用于通信。
write() //4.1 server: write向客户端发送数据
readyRead() //4.2 client: 收到信号readyRead,读数据 readAll()
write() //4.3 client: 发数据
readyRead() //4.4 server: 收到信号readyRead()--> 槽函数去读数据。
disConnectFromHost() //5. client 关闭链接
close() //5.1 client 关闭套接字,关闭的是IO设备。
2.sesrver
server.h
#ifndef SERVER_H
#define SERVER_H
#include <QWidget>
#include <QTcpServer> //network
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Server; }
QT_END_NAMESPACE
class Server : public QWidget
{
Q_OBJECT
public:
Server(QWidget *parent = nullptr);
~Server();
private:
Ui::Server *ui;
QTcpServer* server; //监听的套接字
QTcpSocket* conn; //通信的套接字
};
#endif // SERVER_H
server.cpp
#include "server.h"
#include "ui_server.h"
Server::Server(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Server)
{
ui->setupUi(this);
ui->qIp->setText("127.0.0.1");
ui->qPort->setText("9999");
// init tcp Server, and listen.
server = new QTcpServer(this);
server->listen(QHostAddress(ui->qIp->text()), ui->qPort->text().toInt());
// newConnection.
connect(server, &QTcpServer::newConnection, this, [=](){
//recvive client socket, get client infos.
conn = server->nextPendingConnection();
// send data
//conn->write("abcdefg");
ui->textEdit_recv->append("New TCP connection......");
//保证conn 是一个有效的对象
connect(conn, &QTcpSocket::readyRead, this, [=](){
// recv data, and show.
QByteArray array = conn->readAll();
ui->textEdit_recv->append(array);
});
});
// 发送按钮
connect(ui->btn_send, &QPushButton::clicked, this, [=] (){
QString msg = ui->textEdit_input->toPlainText();
conn->write(msg.toUtf8().data());
ui->textEdit_recv->append("I say:" +msg );
ui->textEdit_input->clear();
});
}
Server::~Server()
{
delete ui;
}
3.client
client.h
#ifndef CLIENT_H
#define CLIENT_H
#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer> //network
namespace Ui {
class Client;
}
class Client : public QWidget
{
Q_OBJECT
public:
explicit Client(QWidget *parent = nullptr);
~Client();
private:
Ui::Client *ui;
QTcpSocket* client;
};
#endif // CLIENT_H
client.cpp
#include "client.h"
#include "ui_client.h"
Client::Client(QWidget *parent) :
QWidget(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
ui->qIp->setText("127.0.0.1");
ui->qPort->setText("9999");
// init tcp
client = new QTcpSocket(this);
// 非阻塞的链接 to server,什么时候链接好,未知。
client->connectToHost(QHostAddress(ui->qIp->text()), ui->qPort->text().toInt());
// receive data
connect(client, &QTcpSocket::readyRead, this, [=](){
// recv data, and show.
QByteArray array = client->readAll();
ui->textEdit_recv->append(array);
});
// send data
connect(ui->btn_send, &QPushButton::clicked, this, [=] (){
QString msg = ui->textEdit_input->toPlainText();
client->write(msg.toUtf8().data());
ui->textEdit_recv->append("Me Say: " + msg);
ui->textEdit_input->clear();
});
}
Client::~Client()
{
delete ui;
}
main.cpp
#include "server.h"
#include "client.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Server w;
w.setWindowTitle("TCP server");
w.show();
Client c;
c.setWindowTitle("Tcp client");
c.show();
return a.exec();
}