结构目录

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_OBJECT
public:
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_OBJECT
public:
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);
}