Qt下Tcp通信的简单使用三
和之前两个例子一样,程序比较简单,刚入门的可以看看,先上效果图。
下面是客户端:
myClient.h
#ifndef CLIENT_H
#define CLIENT_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Client; }
QT_END_NAMESPACEclass QTcpSocket;
class QTimer;class Client : public QDialog
{Q_OBJECTpublic:Client(QWidget *parent = nullptr);~Client();private slots:void slot_readyRead();void slot_connected();void slot_timeout();// void slot_disconnected();void slot_error();void on_connectButton_clicked(bool checked);void on_sendButton_clicked();void slot_sendDatatimeout();
// void on_sendTextEdit_cursorPositionChanged();// void on_sendTextEdit_textChanged();private:Ui::Client *ui;QTcpSocket *myClient;QTimer *timer;// qint8 flag;
};
#endif // CLIENT_H
myClent.cpp
#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
#include <QDebug>
#include <QMessageBox>
#include <QTimer>Client::Client(QWidget *parent): QDialog(parent), ui(new Ui::Client)/*,flag(0)*/
{ui->setupUi(this);myClient = new QTcpSocket(this);connect(myClient,&QTcpSocket::readyRead,this,&Client::slot_readyRead);connect(myClient,&QTcpSocket::connected,this,&Client::slot_connected);connect(myClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error()));
// connect(myClient,&QTcpSocket::disconnected,this,&Client::slot_disconnected);ui->sendButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Client::slot_timeout);connect(timer,&QTimer::timeout,this,&Client::slot_sendDatatimeout);
}Client::~Client()
{delete ui;
}void Client::slot_readyRead()
{if(myClient->bytesAvailable() > 0){ui->recevieTextEdit->append(myClient->readAll());ui->receiveStatus->setText(tr("接收服务端的数据完成!!"));//timer->start(2000);}
}void Client::slot_connected()
{ui->connectStatus->setText(tr("连接成功"));ui->sendButton->setEnabled(true);
}void Client::slot_timeout()
{ui->receiveStatus->setText(tr(" "));
}void Client::slot_error()
{qDebug()<<myClient->errorString();ui->connectButton->setText(tr("连接"));ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));myClient->close();//同上,都不会立即关闭套接字ui->connectButton->setChecked(false);//之前点击时checked=true,下一次点击时checked=false,//要想使下一次点击时是checked=true,就必须在中间设置一次checked=false
}//void Client::slot_disconnected()
//{// ui->connectButton->setText(tr("连接"));
// ui->connectStatus->setText(tr("连接断开"));
// ui->sendStatus->setText(tr(" "));
// ui->receiveStatus->setText(tr(" "));
// myClient->disconnectFromHost();//等待所有的数据被写完之后,关闭套接字
// myClient->close();//同上,都不会立即关闭套接字
// flag = 1;
//}void Client::on_connectButton_clicked(bool checked)//第一次点击时为checked=true,第二次点击时checked=false,依次类推
{if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("提示"),tr("请查看IP和端口是否输入"));return ;}if(checked){ui->connectButton->setText(tr("断开连接"));ui->connectStatus->setText(tr("连接中......"));myClient->connectToHost(ui->IPLineEdit->text(),ui->portLineEdit->text().toInt());}else{ui->connectButton->setText(tr("连接"));ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->sendButton->setEnabled(false);myClient->close();}
}void Client::on_sendButton_clicked()
{QByteArray text = ui->sendTextEdit->toPlainText().toUtf8();if(text.isEmpty()){QMessageBox::information(this,tr("提示"),tr("请输入要发送的数据"));return ;}qint64 bytes = myClient->write(text);if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据成功!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据失败!"));timer->start(2000);}
}void Client::slot_sendDatatimeout()
{ui->sendStatus->setText(tr(" "));
}//void Client::on_sendTextEdit_cursorPositionChanged()
//{// ui->sendStatus->setText(tr(" "));
//}//void Client::on_sendTextEdit_textChanged()
//{// ui->sendStatus->setText(tr(" "));
//}
服务端:
myServer.h
#ifndef SERVER_H
#define SERVER_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Server; }
QT_END_NAMESPACEclass QTcpServer;
class QTcpSocket;
class QTimer;class Server : public QDialog
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void slot_newConnect();void slot_readyRead();void slot_error(QAbstractSocket::SocketError);void slot_timeout();void on_listenButton_clicked();void on_disconnectButton_clicked();void on_sendButton_clicked();void slot_sendDatatimeout();// void on_sendTextEdit_cursorPositionChanged();private:Ui::Server *ui;QTcpServer *myServer;QTcpSocket *socketConnected;QTimer *timer;
};
#endif // SERVER_H
myServer.cpp
#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
#include <QDebug>
#include <QMessageBox>Server::Server(QWidget *parent): QDialog(parent), ui(new Ui::Server)
{ui->setupUi(this);myServer = new QTcpServer(this);connect(myServer,&QTcpServer::newConnection,this,&Server::slot_newConnect);ui->disconnectButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Server::slot_timeout);connect(timer,&QTimer::timeout,this,&Server::slot_sendDatatimeout);
}Server::~Server()
{delete ui;
}void Server::slot_newConnect()
{ui->connectStatus->setText(tr("连接成功"));ui->disconnectButton->setEnabled(true);socketConnected = myServer->nextPendingConnection();connect(socketConnected,SIGNAL(readyRead()),this,SLOT(slot_readyRead()));connect(socketConnected,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error(QAbstractSocket::SocketError)));myServer->close();
}void Server::slot_readyRead()
{if(socketConnected->bytesAvailable() > 0){ui->receiveTextEdit->append(socketConnected->readAll());ui->receiveStatus->setText(tr("接收数据成功!"));timer->start(2000);}
}void Server::slot_error(QAbstractSocket::SocketError)//在连接过程中,突然被断开,客户端主动断开连接时会调用该函数,服务端自己断开连接,不会调用该函数
{qDebug()<<socketConnected->errorString();ui->connectStatus->setText(tr("连接中断"));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->disconnectFromHost();myServer->close();
}void Server::slot_timeout()
{ui->receiveStatus->setText(tr(" "));
}void Server::on_listenButton_clicked()
{if(!myServer->listen(QHostAddress::LocalHost,7878)){qDebug()<<"监听失败!!";ui->connectStatus->setText(tr("监听失败"));}ui->connectStatus->setText(tr("监听成功!!!"));
}void Server::on_disconnectButton_clicked()
{ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->abort();//立即断开myServer->close();
}void Server::on_sendButton_clicked()
{if(ui->sendTextEdit->toPlainText().isEmpty()){QMessageBox::information(this,tr("提示"),tr("请输入要发送的数据!!"));return ;}qint64 bytes = socketConnected->write(ui->sendTextEdit->toPlainText().toUtf8());if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据成功!!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据失败!!"));timer->start(2000);}//ui->sendTextEdit->clear();//为什么在这里的时候达不到先显示数据发送的结构,再将提示小时
}void Server::slot_sendDatatimeout()
{ui->sendStatus->setText(tr(" "));
}//void Server::on_sendTextEdit_cursorPositionChanged()
//{// ui->sendStatus->setText(tr(" "));
//}
运行服务端的程序,点击监听按钮,运行客户端,输入IP和端口,IP是本地地址,端口为7878,点击连接按钮,连接成功后,窗口下面均有连接成功的提示,此时可以客户端和服务端之间相互发送消息,也可以在客户端和服务端任意断开连接后重连,窗口消息发送与接收都有是否成功的提示,没有输入IP和端口之前,若点击了连接按钮,会有提示。
Qt下Tcp通信的简单使用三相关推荐
- (转)winform下TCP通信的简单应用
本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557064 先看效果图: TCP比较繁琐的就是三次握手定理,每次再发送数据前 ...
- Qt中Tcp通信的简单使用二
tcp编程中写的一个简单的单项传输数据的小例子,和上一节一样,分为客户端和服务端程序,下面看一下界面的效果. 创建的方法和之前一样,上面上代码: 客户端 Client.h #ifndef CLIENT ...
- linux下TCP通信简单实例
linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...
- Qt下Tcp传输文件
Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...
- Qt关于Tcp通信步骤的总结
Qt中TCP通信,与C++中tcp通信还是有差别的,下面总结一下Qt中TCP通信. 服务端: 创建QTcpServer对象.可以在构造函数中创建,在.h中声明类QTcpServer,并在类中定义其指针 ...
- 基于QT的TCP通信
一.简介 TCP通信必须先建立TCP链接,通信端分为客户端和服务器端.QT提供了QTcpServer类和QTcpSocket类用于建立TCP通信应用程序.QTcpServer用于端口监听,建立服务器: ...
- access下如何配置两个vlan_不同vlan间的通信如何简单配置(三种方式) ?
1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 一般模式: Switch> 输入enable进入特权模式: Switch>enable 输入config ...
- GPRS模块(SIM900A)在QT下的通信例程
目录 一.SIM900A 二.硬件连线 三.指令解析 四.QT调试程序说明 五.源码 一.SIM900A SIM900A模块为2G模块,采用UART串口通信,含有TTL接口,支持拨打电话.收发短信等日 ...
- Qt中UDP通信的简单示例
udp通信分为发送端和接收端,通信步骤可以分为以下: 接收端: 创建QUdpSocket对象.在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针. bind().绑 ...
最新文章
- 如何用Swift实现一个好玩的弹性动画
- Santa Cruz 上手测试,动作控制器自由度惊人
- C++设计模式之代理模式
- NumPy - np.random.multivariate_normal()
- java web源代码_检测Java Web应用程序而无需修改其源代码
- mysql自定义函数多参数_自定义mysql函数 - 无法传递参数
- 自定义python框架_Python web 框架Sanic 学习: 自定义 Exception
- Qt入门(11)——Qt插件
- linux Pci字符驱动基本加载流程
- java扑克牌排序_扑克牌排列 运用List ArrayList Arrays
- 软件开发丨关于软件重构的灵魂四问
- debugger怎么用_谷歌开发者工具,这些技巧你用过么?
- c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
- 中国移动路由器怎么设置虚拟服务器,中国移动宽带无线wifi设置方法【图】
- 本地可以ping远程的服务器,但服务器不能ping本地
- C++ 1179:奖学金
- 不在同一局域网?组建家庭局域网的方案和踩坑
- 今天,你脸上还长痤疮吗?
- Fiddler Everywhere抓包之视频下载
- 问题 H: LZY碎大石
热门文章
- MySQL 深潜 - 一文详解 MySQL Data Dictionary
- 鹰角网络全球海量数据,一键轻松统一存储与处理
- 太平鸟上云 推动中国服饰行业新零售转型
- 阿里99大促 | 模型识别背后的样本生成
- 阿里云新推出 HiTSDB + IoT套件 物联网设备上云步入快车道
- Web3.0 兴起之际,元宇宙这杯羹怎么分?
- 观测云品牌正式亮相,携手通信院共推国内可观测性概念与技术发展!
- 没错!Python杀死了Excel!
- android read设置超时时间,在Android中的BluetoothSocket inputstream.read()中实现超时
- 用python做tkinter_Python下用Tkinter进行GUI编程