Qt中的TCP服务端和客户端互发消息

简介: Qt中的TCP服务端和客户端互发消息

废话不多说,上演示效果


1.png


由于我们用到socketLamda表达式,所以工程.pro文件需要添加对应的库


2.png


为了方便,main.cpp中让程序显示两个Widget窗口,程序运行起来就可以测试


ServerWidget w;

w.show();

ClientWidget w2;

w2.show();


一、服务端


服务端的UI界面布局:


2个PushButton(send,close)

2个textEdit(发送内容,接收内容)


3.png


新建一个监听套接字,监听端口号为9999的IP,等待连接,有连接过来提示成功连接同时服务端读就绪


//监听套接字,指定父对象,让其自动回收空间
 tcpServer = new QTcpServer(this);
 tcpServer->listen(QHostAddress::Any, 9999);
 setWindowTitle("服务器: 9999");
 //newConnection代表有新的连接
 connect(tcpServer, &QTcpServer::newConnection,
  [=]()
  {
  //取出建立好连接的套接字
  tcpSocket = tcpServer->nextPendingConnection();
  //获取对方的IP和端口
  QString ip = tcpSocket->peerAddress().toString();
  quint16 port = tcpSocket->peerPort();
  QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
  ui->textEditRead->setText(temp);
  //readyRead代表读就绪
  connect(tcpSocket, &QTcpSocket::readyRead,
  [=]()
  {
  //从通信套接字中取出内容
  QByteArray array = tcpSocket->readAll();
  ui->textEditRead->append(array);
  }
  );
  }
  );


二、客户端


客户端的UI界面布局:


3个PushButton(connect,send,close)

2个lineEdit(端口号,IP)

2个textEdit(发送内容,接收内容)


4.png


客户端连接按钮主动与服务端建立连接


void ClientWidget::on_buttonConnect_clicked()
 {
  //获取服务器ip和端口
  QString ip = ui->lineEditIP->text();
  qint16 port = ui->lineEditPort->text().toInt();
  //主动和服务器建立连接
  tcpSocket->connectToHost(QHostAddress(ip), port);
 }


连接成功后会触发connected,提示"成功和服务器建立好连接"同时客户端读就绪


//分配空间,指定父对象
 tcpSocket = new QTcpSocket(this);
 setWindowTitle("客户端");
 connect(tcpSocket, &QTcpSocket::connected,
  [=]()
  {
  ui->textEditRead->setText("成功和服务器建立好连接");
  }
  );
 connect(tcpSocket, &QTcpSocket::readyRead,
  [=]()
  {
  //获取对方发送的内容
  QByteArray array = tcpSocket->readAll();
  //追加到编辑区中
  ui->textEditRead->append(array);
  }
  );


三、源码


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.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);
  tcpServer->listen(QHostAddress::Any, 9999);
  setWindowTitle("服务器: 9999");
  //newConnection代表有新的连接
  connect(tcpServer, &QTcpServer::newConnection,
  [=]()
  {
  //取出建立好连接的套接字
  tcpSocket = tcpServer->nextPendingConnection();
  //获取对方的IP和端口
  QString ip = tcpSocket->peerAddress().toString();
  quint16 port = tcpSocket->peerPort();
  QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
  ui->textEditRead->setText(temp);
  //readyRead代表读就绪
  connect(tcpSocket, &QTcpSocket::readyRead,
  [=]()
  {
  //从通信套接字中取出内容
  QByteArray array = tcpSocket->readAll();
  ui->textEditRead->append(array);
  }
  );
  }
  );
 }
 ServerWidget::~ServerWidget()
 {
  delete ui;
 }
 void ServerWidget::on_buttonSend_clicked()
 {
  if(NULL == tcpSocket)
  {
  return;
  }
  //获取编辑区内容
  QString str = ui->textEditWrite->toPlainText();
  //给对方发送数据, 使用套接字是tcpSocket
  tcpSocket->write( str.toUtf8().data() );
 }
 void ServerWidget::on_buttonClose_clicked()
 {
  if(NULL == tcpSocket)
  {
  return;
  }
  //主动和客户端端口连接
  tcpSocket->disconnectFromHost();
  tcpSocket->close();
  tcpSocket = NULL;
 }

 

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();
  void on_buttonClose_clicked();
 private:
  Ui::ServerWidget *ui;
  QTcpServer *tcpServer; //监听套接字
  QTcpSocket *tcpSocket; //通信套接字
 };
 #endif // SERVERWIDGET_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);
  tcpSocket = NULL;
  //分配空间,指定父对象
  tcpSocket = new QTcpSocket(this);
  setWindowTitle("客户端");
  connect(tcpSocket, &QTcpSocket::connected,
  [=]()
  {
  ui->textEditRead->setText("成功和服务器建立好连接");
  }
  );
  connect(tcpSocket, &QTcpSocket::readyRead,
  [=]()
  {
  //获取对方发送的内容
  QByteArray array = tcpSocket->readAll();
  //追加到编辑区中
  ui->textEditRead->append(array);
  }
  );
 }
 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);
 }
 void ClientWidget::on_buttonSend_clicked()
 {
  //获取编辑框内容
  QString str = ui->textEditWrite->toPlainText();
  //发送数据
  tcpSocket->write( str.toUtf8().data() );
 }
 void ClientWidget::on_buttonClose_clicked()
 {
  //主动和对方断开连接
  tcpSocket->disconnectFromHost();
  tcpSocket->close();
 }


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();
  void on_buttonSend_clicked();
  void on_buttonClose_clicked();
 private:
  Ui::ClientWidget *ui;
  QTcpSocket *tcpSocket; //通信套接字
 };
 #endif // CLIENTWIDGET_H

 

如果你觉得文章还不错,记得"点赞关注"


关注我的微信公众号【 加班猿 】可以获取更多内容

目录
相关文章
|
4月前
|
网络协议 容器
【qt】 TCP编程小项目
【qt】 TCP编程小项目
90 0
|
4月前
|
网络协议
【qt】TCP客户端信息的接受和发送
【qt】TCP客户端信息的接受和发送
36 0
|
4月前
|
网络协议
【qt】TCP客户端如何断开连接?
【qt】TCP客户端如何断开连接?
78 0
|
4月前
【qt】客户端连接到服务器
【qt】客户端连接到服务器
78 0
|
4月前
|
网络协议
【qt】TCP服务器如何停止监听?
【qt】TCP服务器如何停止监听?
51 0
|
4月前
|
网络协议
【qt】TCP服务端发消息给客户端
【qt】TCP服务端发消息给客户端
40 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
201 1
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
118 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
3月前