和之前两个例子一样,程序比较简单,刚入门的可以看看,先上效果图。


下面是客户端:
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通信的简单使用三相关推荐

  1. (转)winform下TCP通信的简单应用

    本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557064 先看效果图: TCP比较繁琐的就是三次握手定理,每次再发送数据前 ...

  2. Qt中Tcp通信的简单使用二

    tcp编程中写的一个简单的单项传输数据的小例子,和上一节一样,分为客户端和服务端程序,下面看一下界面的效果. 创建的方法和之前一样,上面上代码: 客户端 Client.h #ifndef CLIENT ...

  3. linux下TCP通信简单实例

    linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...

  4. Qt下Tcp传输文件

    Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...

  5. Qt关于Tcp通信步骤的总结

    Qt中TCP通信,与C++中tcp通信还是有差别的,下面总结一下Qt中TCP通信. 服务端: 创建QTcpServer对象.可以在构造函数中创建,在.h中声明类QTcpServer,并在类中定义其指针 ...

  6. 基于QT的TCP通信

    一.简介 TCP通信必须先建立TCP链接,通信端分为客户端和服务器端.QT提供了QTcpServer类和QTcpSocket类用于建立TCP通信应用程序.QTcpServer用于端口监听,建立服务器: ...

  7. access下如何配置两个vlan_不同vlan间的通信如何简单配置(三种方式) ?

    1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 一般模式: Switch> 输入enable进入特权模式: Switch>enable 输入config ...

  8. GPRS模块(SIM900A)在QT下的通信例程

    目录 一.SIM900A 二.硬件连线 三.指令解析 四.QT调试程序说明 五.源码 一.SIM900A SIM900A模块为2G模块,采用UART串口通信,含有TTL接口,支持拨打电话.收发短信等日 ...

  9. Qt中UDP通信的简单示例

    udp通信分为发送端和接收端,通信步骤可以分为以下: 接收端: 创建QUdpSocket对象.在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针. bind().绑 ...

最新文章

  1. 如何用Swift实现一个好玩的弹性动画
  2. Santa Cruz 上手测试,动作控制器自由度惊人
  3. C++设计模式之代理模式
  4. NumPy - np.random.multivariate_normal()
  5. java web源代码_检测Java Web应用程序而无需修改其源代码
  6. mysql自定义函数多参数_自定义mysql函数 - 无法传递参数
  7. 自定义python框架_Python web 框架Sanic 学习: 自定义 Exception
  8. Qt入门(11)——Qt插件
  9. linux Pci字符驱动基本加载流程
  10. java扑克牌排序_扑克牌排列 运用List ArrayList Arrays
  11. 软件开发丨关于软件重构的灵魂四问
  12. debugger怎么用_谷歌开发者工具,这些技巧你用过么?
  13. c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
  14. 中国移动路由器怎么设置虚拟服务器,中国移动宽带无线wifi设置方法【图】
  15. 本地可以ping远程的服务器,但服务器不能ping本地
  16. C++ 1179:奖学金
  17. 不在同一局域网?组建家庭局域网的方案和踩坑
  18. 今天,你脸上还长痤疮吗?
  19. Fiddler Everywhere抓包之视频下载
  20. 问题 H: LZY碎大石

热门文章

  1. MySQL 深潜 - 一文详解 MySQL Data Dictionary
  2. 鹰角网络全球海量数据,一键轻松统一存储与处理
  3. 太平鸟上云 推动中国服饰行业新零售转型
  4. 阿里99大促 | 模型识别背后的样本生成
  5. 阿里云新推出 HiTSDB + IoT套件 物联网设备上云步入快车道
  6. Web3.0 兴起之际,元宇宙这杯羹怎么分?
  7. 观测云品牌正式亮相,携手通信院共推国内可观测性概念与技术发展!
  8. 没错!Python杀死了Excel!
  9. android read设置超时时间,在Android中的BluetoothSocket inputstream.read()中实现超时
  10. 用python做tkinter_Python下用Tkinter进行GUI编程