注:本人学习阶段,仅供参考。如有错误,请指正,谢谢!
客户端:
注意:pro文件记得加network
ui界面:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_connect_clicked();
void on_sendmsg_clicked();
void on_disconncet_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // MAINWINDOW_H
注意:这里的槽函数都是转到槽
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->port->setText("8899");
ui->ip->setText("127.0.0.1");
setWindowTitle("客户端 ");
ui->disconncet->setDisabled(true); //禁用小部件
m_tcp = new QTcpSocket;
connect(m_tcp, &QTcpSocket::readyRead, this, [=](){
QByteArray data = m_tcp->readAll();
ui->record->append("服务器say: " + data);
});
connect(m_tcp, &QTcpSocket::disconnected, this, [=](){
m_tcp->close();
m_tcp->deleteLater(); //计划删除此对象
m_status->setText("连接状态:未连接 ");
ui->record->append("已断开服务器!!!");
ui->disconncet->setEnabled(false);
ui->connect->setDisabled(false);
});
connect(m_tcp, &QTcpSocket::connected, this, [=](){
m_status->setText("连接状态:已连接 ");
ui->record->append("成功连接服务器!!!");
ui->disconncet->setEnabled(true);
ui->connect->setDisabled(true);
});
//状态栏
m_status = new QLabel;
m_status->setText("连接状态:未连接 ");
ui->statusbar->addWidget(m_status);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_connect_clicked()
{
QString ip = ui->ip->text();
unsigned short port = ui->port->text().toUShort();
m_tcp->connectToHost(QHostAddress(ip), port);
}
void MainWindow::on_sendmsg_clicked()
{
QString msg = ui->msg->toPlainText();
m_tcp->write(msg.toUtf8());
ui->record->append("客户端say: " + msg);
}
void MainWindow::on_disconncet_clicked()
{
m_tcp->close();
ui->disconncet->setEnabled(false);
ui->connect->setDisabled(false);
}
服务端:
同样pro文件 加network
ui界面:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_setListen_clicked();
void on_sendmsg_clicked();
private:
Ui::MainWindow *ui;
QTcpServer *m_s;
QTcpSocket *m_tcp;
QLabel *m_status;
};
#endif // MAINWINDOW_H
同样这里的槽函数都是转到槽
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->port->setText("8899");
setWindowTitle("Server");
//创建监听对象
m_s = new QTcpServer(this);
connect(m_s, &QTcpServer::newConnection, this, [=](){
m_tcp = m_s->nextPendingConnection();
m_status->setText("连接状态:已连接 ");
//检测是否可以接收数据
connect(m_tcp, &QTcpSocket::readyRead, this, [=](){
QByteArray data = m_tcp->readAll();
ui->record->append("客户端say: " + data); //文本追加到文本末尾
});
connect(m_tcp, &QTcpSocket::disconnected, this, [=](){
m_tcp->close();
m_tcp->deleteLater();
m_status->setText("连接状态:未连接 ");
});
});
//状态栏
m_status = new QLabel;
m_status->setText("连接状态:未连接 ");
ui->statusbar->addWidget(m_status);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_setListen_clicked()
{
unsigned short port = ui->port->text().toUShort();
m_s->listen(QHostAddress::Any, port);
ui->setListen->setDisabled(true); //禁用小部件
}
void MainWindow::on_sendmsg_clicked()
{
QString msg = ui->msg->toPlainText(); //纯文本读出
m_tcp->write(msg.toUtf8()); //转换为QByteArray
ui->record->append("服务器say: " + msg);
}