1、clicent
1、connect:通過socket發送的connected連接信號,判斷是否連接到服務器
2、通過按鍵點擊的槽函數void Widget::on_pushButton_clicked()
將ip地址和端口通過socket的connectToHost連接到服務器
3、客戶端可以通過readyRead信號來進行判斷服務器有無信息發送。通過socket的readall將內容全部讀取到
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QHostAddress>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
//連接服務器
connect(socket,&QTcpSocket::connected,
[this]()
{
qDebug()<<"連接成功";
});
//當有數據發送過來的時候,會觸發信號
connect(socket,&QTcpSocket::readyRead,
[this]()
{
QByteArray data = socket->readAll();
QString s = QString(data);
ui->textEdit->append(s);
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString ip = ui->lineEdit->text();
uint16_t port = ui->lineEdit_2->text().toInt();
socket->connectToHost(QHostAddress(ip),port);
}
void Widget::on_pushButton_2_clicked()
{
QString data = ui->textEdit_2->toPlainText();
socket->write(data.toUtf8());
QString s = QString("me:%1").arg(data);
ui->textEdit->append(s);
}
2、服務器
1、newConnection信號進行接收客戶端連接,但是由於信號是沒有順序的,爲了防止不出錯。通過hasPendingConnections來確認信號接收完畢
接收客戶端請求,產生一個和客戶端通信的套接字QTcpSocket *s
獲取readyRead信號通過槽函數
對數據進行處理
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QTcpSocket>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
server = new QTcpServer(this);
server->listen(QHostAddress::Any, 9999);
connect(server, &QTcpServer::newConnection,
[this]()
{
while(server->hasPendingConnections())
{
// 接收客戶端請求,產生一個和客戶端通信的套接字
QTcpSocket *s = server->nextPendingConnection();
connect(s, &QTcpSocket::readyRead, this, &Widget::handleClient);
}
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClient()
{
// 信號的發出者
QTcpSocket *s = (QTcpSocket *)sender();
while (s->bytesAvailable())
{
QByteArray data = s->readAll(); // 讀到的數據
s->write(data);
}
}