结构目录

main.cpp文件
#include "serverwidget.h"#include <QApplication>#include "clientwidget.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); ServerWidget w; w.show(); ClientWidget w2; w2.show(); return a.exec();}
服务端代码
serverwidget.h
#ifndef SERVERWIDGET_H#define SERVERWIDGET_H#include <QWidget>#include <QTcpServer> // 监听套接字#include <QTcpSocket> // 通信套接字namespace Ui {class ServerWidget;}class ServerWidget : public QWidget{ Q_OBJECTpublic: explicit ServerWidget(QWidget *parent = 0); ~ServerWidget();private slots: void on_buttonSend_clicked();private: Ui::ServerWidget *ui; QTcpServer *tcpServer; // 监听套接字 QTcpSocket *tcpSocket; // 通信套接字};#endif // SERVERWIDGET_H
serverwidget.cpp
#include "serverwidget.h"#include "ui_serverwidget.h"#include <QDebug>ServerWidget::ServerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ServerWidget){ ui->setupUi(this); tcpServer = NULL; tcpSocket = NULL; // 监听套接字, 指定父对象,让其自动回收空间 tcpServer = new QTcpServer(this);// tcpSocket = new QTcpSocket(this); // Any表示绑定所有网卡的IP地址 tcpServer->listen(QHostAddress::Any, 9998); this->setWindowTitle("服务端-端口:9998"); // 建立连接 connect(tcpServer, &QTcpServer::newConnection, [=](){ // 取出建立好连接的套接字 tcpSocket = tcpServer->nextPendingConnection(); // 获取对方的IP和端口 QString ip = tcpSocket->peerAddress().toString(); qint16 port = tcpSocket->peerPort(); QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port); qDebug() << temp; ui->textEditRead->setText(temp); // 获取客户端返回的数据 connect(tcpSocket, &QTcpSocket::readyRead, [=](){ // 从通信套接字中取出内容 QByteArray array = tcpSocket->readAll(); ui->textEditRead->append(array); }); // 关闭连接 connect(ui->buttonClose, &QPushButton::clicked, [=](){ tcpSocket->disconnectFromHost(); tcpSocket->close(); }); });}ServerWidget::~ServerWidget(){ delete ui;}void ServerWidget::on_buttonSend_clicked(){ if(tcpSocket == NULL) { return; } // 获取编辑区内容 QString str = ui->textEditWrite->toPlainText(); // 给对方发送数据,使用套接字是tcpSocket tcpSocket->write(str.toUtf8().data());}
客户端代码
clientwidget.h
#ifndef CLIENTWIDGET_H#define CLIENTWIDGET_H#include <QWidget>#include <QTcpSocket> // 通信套接字namespace Ui {class ClientWidget;}class ClientWidget : public QWidget{ Q_OBJECTpublic: explicit ClientWidget(QWidget *parent = 0); ~ClientWidget();private slots: void on_buttonConnect_clicked();private: Ui::ClientWidget *ui; // 通信套接字 QTcpSocket *tcpSocket;};#endif // CLIENTWIDGET_H
clientwidget.cpp
#include "clientwidget.h"#include "ui_clientwidget.h"#include <QHostAddress>ClientWidget::ClientWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ClientWidget){ ui->setupUi(this); this->setWindowTitle("客户端"); // tcpSocket = NULL; // 分配空间 tcpSocket = new QTcpSocket(this); // 与服务器建立连接 connect(tcpSocket, &QTcpSocket::connected, [=](){ ui->textEditRead->setText("成功和服务器建立连接"); }); // 获取服务器发送的内容 connect(tcpSocket, &QTcpSocket::readyRead, [=](){ // 获取客户端发送的内容 QByteArray array = tcpSocket->readAll(); // 将获取的数据写到编辑区中 ui->textEditRead->append(array); }); // 点击send按钮发送数据 connect(ui->buttonSend, &QPushButton::clicked, [=](){ // 判断是否已经建立了连接 if(tcpSocket == NULL) { return; } // 获取编辑框内容 QString str = ui->textEditWrite->toPlainText(); // 发送数据 tcpSocket->write(str.toUtf8().data()); }); // 关闭和服务器的连接 connect(ui->buttonClone, &QPushButton::clicked, [=](){ // tcpSocket->write("已断开连接"); // 主动和对方断开连接 tcpSocket->disconnectFromHost(); tcpSocket->close(); });}ClientWidget::~ClientWidget(){ delete ui;}void ClientWidget::on_buttonConnect_clicked(){ // 获取要发送给服务器ip和端口 QString ip = ui->lineEditIP->text(); qint16 port = ui->lineEditPort->text().toInt(); // 主动和服务器建立连接 tcpSocket->connectToHost(QHostAddress(ip), port);}