network.png

结构目录

image.png

main.cpp文件

  1. #include "serverwidget.h"
  2. #include <QApplication>
  3. #include "clientwidget.h"
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. ServerWidget w;
  8. w.show();
  9. ClientWidget w2;
  10. w2.show();
  11. return a.exec();
  12. }

服务端代码

image.png

serverwidget.h

  1. #ifndef SERVERWIDGET_H
  2. #define SERVERWIDGET_H
  3. #include <QWidget>
  4. #include <QTcpServer> // 监听套接字
  5. #include <QTcpSocket> // 通信套接字
  6. namespace Ui {
  7. class ServerWidget;
  8. }
  9. class ServerWidget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit ServerWidget(QWidget *parent = 0);
  14. ~ServerWidget();
  15. private slots:
  16. void on_buttonSend_clicked();
  17. private:
  18. Ui::ServerWidget *ui;
  19. QTcpServer *tcpServer; // 监听套接字
  20. QTcpSocket *tcpSocket; // 通信套接字
  21. };
  22. #endif // SERVERWIDGET_H

serverwidget.cpp

  1. #include "serverwidget.h"
  2. #include "ui_serverwidget.h"
  3. #include <QDebug>
  4. ServerWidget::ServerWidget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::ServerWidget)
  7. {
  8. ui->setupUi(this);
  9. tcpServer = NULL;
  10. tcpSocket = NULL;
  11. // 监听套接字, 指定父对象,让其自动回收空间
  12. tcpServer = new QTcpServer(this);
  13. // tcpSocket = new QTcpSocket(this);
  14. // Any表示绑定所有网卡的IP地址
  15. tcpServer->listen(QHostAddress::Any, 9998);
  16. this->setWindowTitle("服务端-端口:9998");
  17. // 建立连接
  18. connect(tcpServer, &QTcpServer::newConnection, [=](){
  19. // 取出建立好连接的套接字
  20. tcpSocket = tcpServer->nextPendingConnection();
  21. // 获取对方的IP和端口
  22. QString ip = tcpSocket->peerAddress().toString();
  23. qint16 port = tcpSocket->peerPort();
  24. QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
  25. qDebug() << temp;
  26. ui->textEditRead->setText(temp);
  27. // 获取客户端返回的数据
  28. connect(tcpSocket, &QTcpSocket::readyRead, [=](){
  29. // 从通信套接字中取出内容
  30. QByteArray array = tcpSocket->readAll();
  31. ui->textEditRead->append(array);
  32. });
  33. // 关闭连接
  34. connect(ui->buttonClose, &QPushButton::clicked, [=](){
  35. tcpSocket->disconnectFromHost();
  36. tcpSocket->close();
  37. });
  38. });
  39. }
  40. ServerWidget::~ServerWidget()
  41. {
  42. delete ui;
  43. }
  44. void ServerWidget::on_buttonSend_clicked()
  45. {
  46. if(tcpSocket == NULL)
  47. {
  48. return;
  49. }
  50. // 获取编辑区内容
  51. QString str = ui->textEditWrite->toPlainText();
  52. // 给对方发送数据,使用套接字是tcpSocket
  53. tcpSocket->write(str.toUtf8().data());
  54. }

客户端代码

image.png

clientwidget.h

  1. #ifndef CLIENTWIDGET_H
  2. #define CLIENTWIDGET_H
  3. #include <QWidget>
  4. #include <QTcpSocket> // 通信套接字
  5. namespace Ui {
  6. class ClientWidget;
  7. }
  8. class ClientWidget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit ClientWidget(QWidget *parent = 0);
  13. ~ClientWidget();
  14. private slots:
  15. void on_buttonConnect_clicked();
  16. private:
  17. Ui::ClientWidget *ui;
  18. // 通信套接字
  19. QTcpSocket *tcpSocket;
  20. };
  21. #endif // CLIENTWIDGET_H

clientwidget.cpp

  1. #include "clientwidget.h"
  2. #include "ui_clientwidget.h"
  3. #include <QHostAddress>
  4. ClientWidget::ClientWidget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::ClientWidget)
  7. {
  8. ui->setupUi(this);
  9. this->setWindowTitle("客户端");
  10. //
  11. tcpSocket = NULL;
  12. // 分配空间
  13. tcpSocket = new QTcpSocket(this);
  14. // 与服务器建立连接
  15. connect(tcpSocket, &QTcpSocket::connected, [=](){
  16. ui->textEditRead->setText("成功和服务器建立连接");
  17. });
  18. // 获取服务器发送的内容
  19. connect(tcpSocket, &QTcpSocket::readyRead, [=](){
  20. // 获取客户端发送的内容
  21. QByteArray array = tcpSocket->readAll();
  22. // 将获取的数据写到编辑区中
  23. ui->textEditRead->append(array);
  24. });
  25. // 点击send按钮发送数据
  26. connect(ui->buttonSend, &QPushButton::clicked, [=](){
  27. // 判断是否已经建立了连接
  28. if(tcpSocket == NULL)
  29. {
  30. return;
  31. }
  32. // 获取编辑框内容
  33. QString str = ui->textEditWrite->toPlainText();
  34. // 发送数据
  35. tcpSocket->write(str.toUtf8().data());
  36. });
  37. // 关闭和服务器的连接
  38. connect(ui->buttonClone, &QPushButton::clicked, [=](){
  39. //
  40. tcpSocket->write("已断开连接");
  41. // 主动和对方断开连接
  42. tcpSocket->disconnectFromHost();
  43. tcpSocket->close();
  44. });
  45. }
  46. ClientWidget::~ClientWidget()
  47. {
  48. delete ui;
  49. }
  50. void ClientWidget::on_buttonConnect_clicked()
  51. {
  52. // 获取要发送给服务器ip和端口
  53. QString ip = ui->lineEditIP->text();
  54. qint16 port = ui->lineEditPort->text().toInt();
  55. // 主动和服务器建立连接
  56. tcpSocket->connectToHost(QHostAddress(ip), port);
  57. }