1.主要流程
1.客戶端
-
創建QTcpSocket對象
-
連接到服務器 --connectToHost()
-
-
讀取數據 ---readAll()
-
斷開連接
2.服務器
-
創建QTcpServer 對象
-
綁定本地信息---listen(QHostAddress::Any,端口)
-
等待客戶端連接---newConnection()
-
讀取數據
-
發送數據
-
斷開連接
2.頭文件
-
客戶端:#include < QTcpSocket >
-
服務器:#include < QTcpServer >
-
必須要在pro文件加上-----QT += core gui network
3.代碼
1.客戶端
-
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QtNetwork/QTcpSocket> #include <QKeyEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT private: QTcpSocket *client; QString *message; void keyPressEvent(QKeyEvent *event); public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H
-
widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QTextEdit> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); client = new QTcpSocket(this); ui->Button_send->setEnabled(false); /* 連接服務器 */ connect(ui->Button_connection,&QPushButton::released,this, [=]() { client->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_d->text().toInt()); }); /* 連接成功 */ connect(client,&QTcpSocket::connected,this, [&]() { ui->Button_send->setEnabled(true); ui->label_prompt->setText("已連接"); ui->textEdit_receive->append("連接成功……"); }); /* 發送到服務器 */ connect(ui->Button_send,&QPushButton::released,this, [&]() { QString data = ui->textEdit_edit->toPlainText(); if(data.length() > 0) //如果輸入框不為空才可以發送 { client->write(data.toUtf8()); QString data1 = "已發送:"+data; ui->textEdit_receive->append(data1); } else { ui->textEdit_receive->append("輸入信息"); } }); /* 接收信息 */ connect(client,&QTcpSocket::readyRead,this, [&]() { QString msg = "收到:" + client->readAll(); ui->textEdit_receive->append(msg); }); /* 斷開連接 */ connect(ui->Button_disconnect,&QPushButton::released,this, [=]() { client->disconnectFromHost(); ui->Button_send->setEnabled(false); }); /* 斷開連接 */ connect(client,&QTcpSocket::disconnected,this, [&]() { ui->label_prompt->setText("未連接……"); ui->textEdit_receive->append("斷開連接……"); }); } /* 鍵盤事件:捕獲按下回車鍵發送---這一部分可選擇不要 */ void Widget::keyPressEvent(QKeyEvent *event) { int key = event->key(); if(key == Qt::Key_Enter) { QString data = ui->textEdit_edit->toPlainText(); if(data.length() > 0) { client->write(data.toUtf8()); QString data1 = "已發送:"+data; ui->textEdit_receive->append(data1); } else { ui->textEdit_receive->append("輸入信息"); } } } Widget::~Widget() { delete ui; }
2.服務器
-
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> #include <QKeyEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: QTcpServer *server; QTcpSocket *socket; void new_client(); void send_data(); void read_data(); void disconnect(); void keyPressEvent(QKeyEvent *event); //重寫鍵盤事件虛函數,如果不要鍵盤發 //送可選擇刪掉 public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H
-
widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->Button_send->setEnabled(false); server = new QTcpServer(this); /* 綁定綁定信息 */ server->listen(QHostAddress::Any,ui->lineEdit_d->text().toInt()); /* 等待客戶端連接 */ connect(server,&QTcpServer::newConnection,this,&Widget::new_client); /* 發送信息 */ connect(ui->Button_send,&QPushButton::released,this,&Widget::send_data); } /* 等待連接 */ void Widget::new_client() { qDebug() << "新客戶連接"; ui->label_prompt->setText("已連接"); ui->textEdit_log->append("連接成功"); ui->Button_send->setEnabled(true); socket = server->nextPendingConnection(); connect(socket,&QTcpSocket::readyRead,this,&Widget::read_data); connect(ui->Button_disconnect,&QPushButton::released,socket,&QTcpSocket::disconnectFromHost); connect(socket,&QTcpSocket::disconnected,this, [&]() { ui->textEdit_log->append("斷開連接"); }); } /* 發送信息 */ void Widget::send_data() { QString data = ui->textEdit_edit->toPlainText(); if(data.length() > 0) //如果輸入欄不為空才可以發送 { socket->write(data.toUtf8()); QString data1 = "已發送:" + data; ui->textEdit_log->append(data1); } else { ui->textEdit_log->append("輸入信息"); } } /* 接收信息 */ void Widget::read_data() { // QTcpSocket *obj = (QTcpSocket*)sender(); QString msg = "收到:" + socket->readAll(); ui->textEdit_log->append(msg); } /* 斷開連接 */ void Widget::disconnect() { ui->textEdit_log->append("斷開連接"); ui->Button_send->setEnabled(false); } /* 回車鍵發送 ----- 可選擇不要 */ void Widget::keyPressEvent(QKeyEvent *event) { int key = event->key(); if(key == Qt::Key_Enter) { QString data = ui->textEdit_edit->toPlainText(); if(data.length() > 0) //如果輸入欄不為空才可以發送 { qDebug() << data.length(); socket->write(data.toUtf8()); QString data1 = "已發送:" + data; ui->textEdit_log->append(data1); } else { ui->textEdit_log->append("輸入信息"); } } } Widget::~Widget() { delete ui; }