服务端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QString>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QTcpServer *tcpServer;//槽函数来接收客户端的连接请求;
private slots:void mNewConnection();void receiveMessage();void mStateChanged(QAbstractSocket::SocketState);void on_pushButton_3_clicked();void on_pushButton_clicked();void on_pushButton_2_clicked();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("服务端");//设置初始不可用ui->pushButton_2->setEnabled(false);tcpServer = new QTcpServer(this);connect(tcpServer,SIGNAL(newConnection()),this,SLOT(mNewConnection()));
}Widget::~Widget()
{delete ui;
}void Widget::mNewConnection()
{//与客户端连接;QTcpSocket *temTcpSocket = tcpServer->nextPendingConnection();//打印ip地址;QString ipAddr = temTcpSocket->peerAddress().toString();ui->textBrowser->append("客户端IP地址:"+ipAddr);//打印port地址;quint16 port = temTcpSocket->peerPort();ui->textBrowser->append("客户端port地址:"+QString::number(port));connect(temTcpSocket,SIGNAL(readyRead()),this,SLOT(receiveMessage()));//connect(temTcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(mStateChanged(QAbstractSocket::SocketState)));
}//接收消息
void Widget::receiveMessage()
{//接收消息并打印;QTcpSocket *temTcpSocket = (QTcpSocket*)sender();ui->textBrowser->append("客户端:"+temTcpSocket->readAll());
}void Widget::mStateChanged(QAbstractSocket::SocketState state)
{QTcpSocket *temTcpSocket = (QTcpSocket *)sender();switch (state) {case QAbstractSocket:: UnconnectedState:ui->textBrowser->append("客户端断开");//断开释放内存;temTcpSocket->deleteLater();break;//经调试,这句话不会打印;case QAbstractSocket:: ConnectedState:ui->textBrowser->append("客户端已连接");break;default:break;}
}//发送信息;
void Widget::on_pushButton_3_clicked()
{//通过容器向所有的客户端发送信息;QList <QTcpSocket*> socketList = tcpServer->findChildren<QTcpSocket*>();qDebug()<<"客户端的数量:"<<socketList.count()<<endl;if(socketList.count() == 0){ui->textBrowser->append("没有客户端连接!");return;}foreach(QTcpSocket *temSocket,socketList){temSocket->write(ui->lineEdit->text().toUtf8());}ui->textBrowser->append("服务端:"+ui->lineEdit->text().toUtf8());
}
//连接客户端;
void Widget::on_pushButton_clicked()
{tcpServer->listen(QHostAddress("192.168.128.22"),9999);ui->textBrowser->append("开始监听...");ui->pushButton_2->setEnabled(true);ui->pushButton->setEnabled(false);
}
//停止监听
void Widget::on_pushButton_2_clicked()
{tcpServer->close();ui->pushButton_2->setEnabled(false);ui->pushButton->setEnabled(true);
}

客户端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QHostAddress>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QTcpSocket *tcpSocket;private slots:void receiveMessage();void mStateChange(QAbstractSocket::SocketState state);void on_pushButton_3_clicked();void on_pushButton_clicked();void on_pushButton_2_clicked();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客户端");ui->pushButton_2->setEnabled(false);tcpSocket = new QTcpSocket(this);connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveMessage()));connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(mStateChange(QAbstractSocket::SocketState)));
}Widget::~Widget()
{delete ui;
}//客户端收到消息后,会触发槽函数,接收信息并打印出来;
void Widget::receiveMessage()
{ui->textBrowser->append("服务端:"+tcpSocket->readAll());
}void Widget::mStateChange(QAbstractSocket::SocketState state)
{switch (state){case QAbstractSocket::UnconnectedState:ui->textBrowser->append("已断开");ui->pushButton_2->setEnabled(false);ui->pushButton->setEnabled(true);break;case QAbstractSocket::ConnectedState:ui->textBrowser->append("已连接");ui->pushButton_2->setEnabled(true);ui->pushButton->setEnabled(false);break;default:break;}
}//发送消息;
void Widget::on_pushButton_3_clicked()
{if(tcpSocket->state() == QAbstractSocket::ConnectedState){tcpSocket->write(ui->lineEdit->text().toUtf8());ui->textBrowser->append("客户端:"+ui->lineEdit->text().toUtf8());}else {ui->textBrowser->append("未连接,请先连接服务器!");}
}
//连接服务器
void Widget::on_pushButton_clicked()
{tcpSocket->connectToHost(QHostAddress("192.168.128.22"),9999);}
//断开服务器
void Widget::on_pushButton_2_clicked()
{tcpSocket->disconnectFromHost();
}

最终效果:

Qt TCP服务端、客户端;QTcpSocket相关推荐

  1. java mina tcp_Mina TCP服务端客户端 示例

    服务端代码:package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; imp ...

  2. Qt TCP服务端和客户端连接

    前言 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP旨在适应支持多网络应用的分层协议层次结构. 连接到 ...

  3. Go实现简单的TCP服务端客户端通信(有黏包)

    目录 客户端代码 服务端代码 封包协议 客户端代码 // socket_stick/client2/main.gofunc main() {conn, err := net.Dial("tc ...

  4. 为什么TCP服务端需要调用bind函数而客户端通常不需要呢

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 那一年, ...

  5. Qt 多线程TCP服务端一键关闭所有客户端

    Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...

  6. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  7. Qt中TCP服务端编程

    文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...

  8. Qt 的 tcp服务端讲解

    TCP TCP : (Tramsmission Control Protocl)传输控制协议,一种面向连接的,可靠的,基于字节流的传输层通信协议. 本文目标 实现一个简单的服务器,可以接受客户端的信息 ...

  9. Qt多线程 TCP 服务端

    Qt实现 多线程 TCP 服务端 因为项目中要用到TCP客户端的并发处理,所以TCP服务端用多线程去实现是必要的.于是花了一大早上的时间写了一各Demo 如图: 主要关键代码: 关于线程的处理.关于线 ...

  10. TCP聊天文件服务器v2.2 - 服务端客户端套接字解决分包/粘包问题 - SocketQueue继承以及减少冗余

    TCP聊天+传输文件服务器服务器套接字v2.2 整个图当封面吧 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread ...

最新文章

  1. Xcode Debugging
  2. 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
  3. ELK下Elasticsearch如何关掉服务
  4. 《交互式程序设计 第2版》一第2章 编程基础
  5. 数据结构与算法笔记一:稀疏数组的应用
  6. 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
  7. Java 自动化测试详解
  8. 学计算机要学工图吗,工程图学及计算机绘图: 非机类
  9. r语言和python爬虫谁厉害_从事数据科学Python和R语言学哪个好?
  10. python怎么导入包-python如何导入包
  11. 为什么提问能力很重要?
  12. 【C语言初级】 在有序数组中在折半查找数值并打印下标
  13. 第一届全国大学生GIS应用技能大赛试题答案及数据下载(下午)
  14. Word中的拼页、书籍折页、反向书籍折页(二)
  15. c++学习笔记(6)
  16. f2fs系列文章fsck(四)
  17. No.051<软考>《(高项)备考大全》【冲刺5】《软考之 119个工具 (3)》
  18. delphi 获取本机IP地址和MAC地址
  19. Win7中的软链接详解(mklink命令)
  20. 冬冬爬楼梯,一步可以1级,也可以爬2级、3级。冬冬很可爱,每到一处楼梯处,他都想知道直完这个楼梯有多少种走法。但由于有的时候楼梯级数太多,可能是个天文数字,很显然,对于还处于小学5年级的冬冬是不太现实

热门文章

  1. Exploring Sparsity in Image Super-Resolution for Efficient Inference
  2. 获取Android设备的序列号(SN号)
  3. 色彩原理与色彩搭配知识点回顾总结
  4. Windows无法访问指定设备,路径或文件.您可能没有合适的权限访问这个项目
  5. 海康球机3D定位功能编码实现VC(对前一篇补充改进)
  6. 机器学习与数据挖掘学习之路
  7. 统计学、机器学习、数据挖掘、深度学习的关系
  8. 配置mysql读写分离
  9. matlab求极限趋近0,matlab求极限和导数
  10. Photoshop CS6版本安装及破解教程