Qt TCP服务端、客户端;QTcpSocket
服务端:
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相关推荐
- java mina tcp_Mina TCP服务端客户端 示例
服务端代码:package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; imp ...
- Qt TCP服务端和客户端连接
前言 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP旨在适应支持多网络应用的分层协议层次结构. 连接到 ...
- Go实现简单的TCP服务端客户端通信(有黏包)
目录 客户端代码 服务端代码 封包协议 客户端代码 // socket_stick/client2/main.gofunc main() {conn, err := net.Dial("tc ...
- 为什么TCP服务端需要调用bind函数而客户端通常不需要呢
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 那一年, ...
- Qt 多线程TCP服务端一键关闭所有客户端
Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...
- Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)
Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...
- Qt中TCP服务端编程
文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...
- Qt 的 tcp服务端讲解
TCP TCP : (Tramsmission Control Protocl)传输控制协议,一种面向连接的,可靠的,基于字节流的传输层通信协议. 本文目标 实现一个简单的服务器,可以接受客户端的信息 ...
- Qt多线程 TCP 服务端
Qt实现 多线程 TCP 服务端 因为项目中要用到TCP客户端的并发处理,所以TCP服务端用多线程去实现是必要的.于是花了一大早上的时间写了一各Demo 如图: 主要关键代码: 关于线程的处理.关于线 ...
- TCP聊天文件服务器v2.2 - 服务端客户端套接字解决分包/粘包问题 - SocketQueue继承以及减少冗余
TCP聊天+传输文件服务器服务器套接字v2.2 整个图当封面吧 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread ...
最新文章
- Xcode Debugging
- 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
- ELK下Elasticsearch如何关掉服务
- 《交互式程序设计 第2版》一第2章 编程基础
- 数据结构与算法笔记一:稀疏数组的应用
- 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
- Java 自动化测试详解
- 学计算机要学工图吗,工程图学及计算机绘图: 非机类
- r语言和python爬虫谁厉害_从事数据科学Python和R语言学哪个好?
- python怎么导入包-python如何导入包
- 为什么提问能力很重要?
- 【C语言初级】 在有序数组中在折半查找数值并打印下标
- 第一届全国大学生GIS应用技能大赛试题答案及数据下载(下午)
- Word中的拼页、书籍折页、反向书籍折页(二)
- c++学习笔记(6)
- f2fs系列文章fsck(四)
- No.051<软考>《(高项)备考大全》【冲刺5】《软考之 119个工具 (3)》
- delphi 获取本机IP地址和MAC地址
- Win7中的软链接详解(mklink命令)
- 冬冬爬楼梯,一步可以1级,也可以爬2级、3级。冬冬很可爱,每到一处楼梯处,他都想知道直完这个楼梯有多少种走法。但由于有的时候楼梯级数太多,可能是个天文数字,很显然,对于还处于小学5年级的冬冬是不太现实