TCP 客户端编程
1.Qt中TCP客户端编程
- 对Qt编程而言,网络只是数据传输的通道;
- Qt提供了QTcpSocket类(封装了TCP协议细节);
- 将QTcpSocket的对象当做黑盒使用,进行数据首发。

1.1QTcpSocket类的继承

1.2QTcpSocket的使用
- 连接服务器主机(connectToHost())
- 发送数据/接受数据(write()/read())
- 关闭连接(close())
1.3QTcpSocket的注意事项
- 默认情况下,QTcpSocket使用异步编程的方式
- 操作完成后立即返回(返回只代表的操作开始,不代表操作的结果,类似C语言中的回调函数以及Qt中的信号和槽机制)
- 通过发送信号的方式返回操作的结果
2.QTcpSocket同步编程
2.1QTcpSocket提供辅助函数可完成同步编程的方式(返回值代表返回结果,平时编程使用的大多是同步编程的方式)
- waitForConnected()/waitForDisconnected()
- waitForBytesWritten()/waitForReadyRead()
2.2QTcpSocket同步编程流程
调用完功能函数(如connectToHost)立刻调用对应的同步辅助函数即实现同步编程

2.3QTcpSocket同步编程代码
代码运行时需启动socket的服务程序模拟tcp服务端

#include "clientdemo.h"
#include <QtGui/QApplication>
#include <QTcpSocket>
#include <QDebug>
void SyncClientDemo()
{
QTcpSocket client;
char buf[256] = {0};
client.connectToHost("127.0.0.1", 8080);
qDebug() << "Connected:" << client.waitForConnected();
qDebug() << "Send Bytes:" << client.write("D.T.Software");
qDebug() << "Send Status:" << client.waitForBytesWritten();
qDebug() << "Data Available:" << client.waitForReadyRead();
qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf)-1);
qDebug() << "Received Data:" << buf;
client.close();
// client.waitForDisconnected();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SyncClientDemo();
//ClientDemo w;
//w.show();
return a.exec();
}
结果


3.QTcpSocket异步编程
3.1 QTcpSocket的异步编程
- QTcpSocket的对象通过发送信号的方式返回操作结果
- 可以在程序中将对应的信号连接到槽函数,获取结果
- 在GUI应用程序中通常使用QTcpSocket的异步编程方式
3.2QTcpSocket中的关键信号
- connected():成功连接远端主机
- disconnected:远程主机断开连接
- readyRead():远端主机数据到达本机
- bytesWritten(qint64):数据成功发送至系统(OS)
3.3编程实践
clientdemo.h
#ifndef CLIENTDEMO_H
#define CLIENTDEMO_H
#include <QObject>
//#include "ui_clientdemo.h"
#include <QTcpSocket>
class ClientDemo : public QObject
{
Q_OBJECT
QTcpSocket m_client;
protected slots:
void onConnected();
void onDisconnected();
void onDataReady();
void onBytesWritten(qint64 bytes);
public:
qint64 send(const char* data, int len);
qint64 available();//得到到达本机的数据长度
ClientDemo(QObject *parent = NULL);
void connectToHost(QString ip,int port);
void close();
~ClientDemo();
private:
// Ui::ClientDemoClass ui;
};
#endif // CLIENTDEMO_H
clientdemo.cpp
#include "clientdemo.h"
#include <QDebug>
ClientDemo::ClientDemo(QObject *parent): QObject(parent)
{
//ui.setupUi(this);
connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()) );
connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));
connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}
void ClientDemo::onConnected()
{
qDebug() << "onConnected";
qDebug() << "Local Address:" ;//<< m_client.localAddress();
qDebug() << "Local Port:" << m_client.localPort();
}
void ClientDemo::onDisconnected()
{
qDebug() << "onDisconnected";
}
void ClientDemo::onDataReady()
{
char buf[256] = {0};
qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf)-1);
qDebug() << "Data:" << buf;
}
void ClientDemo::onBytesWritten(qint64 bytes)
{
qDebug() << "onBytesWritten:" << bytes;
}
void ClientDemo::connectToHost(QString ip,int port)
{
m_client.connectToHost(ip, port);
}
qint64 ClientDemo::send(const char* data, int len)
{
return m_client.write(data, len);
}
qint64 ClientDemo::available()
{
return m_client.bytesAvailable();
}
void ClientDemo::close()
{
m_client.close();
}
ClientDemo::~ClientDemo()
{
}
main.cpp
#include "clientdemo.h"
#include <QtGui/QApplication>
#include <QTcpSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//SyncClientDemo();
ClientDemo w;
w.connectToHost("127.0.0.1",8080);
char buf[]="abc";
w.send(buf,sizeof(buf)-1);
//w.show();
return a.exec();
}
结果


4.小结
- Qt提供了QTcpSocket类,其对象可用于收发TCP数据
- QTcpSocket默认使用异步编程方式
- QTcpSocket提供辅助函数用于完成同步编程的方式
- GUI应用程序通常使用QTcpSocket的异步编程方式
TCP 客户端编程的更多相关文章
- android 之TCP客户端编程
补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...
- Android之TCP服务器编程
推荐一个学java或C++的网站http://www.weixueyuan.net/,本来想自己学了总结出来再写博客,现在没时间,打字太慢!!!!,又想让这好东西让许多人知道. 关于网络通信:每一台电 ...
- python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景
相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...
- --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能
PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...
- Python--网络编程学习笔记系列02 附:tcp服务端,tcp客户端
Python--网络编程学习笔记系列02 TCP和UDP的概述: udp通信模型类似于写信,不需要建立相关链接,只需要发送数据即可(现在几乎不用:不稳定,不安全) tcp通信模型类似于打电话,一定要建 ...
- Java网络编程(TCP客户端)
TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...
- python编程系列---tcp客户端的简单实现
实现流程如下: """ TCP客户端实现流程1. 创建一个tcp 客户端对象2. 与服务端建立连接3. 通过tcp socket 收发数据4. 关闭连接 关闭tcp &q ...
- TCP客户端服务器编程模型
1.客户端调用序列 客户端编程序列如下: 调用socket函数创建套接字 调用connect连接服务器端 调用I/O函数(read/write)与服务器端通讯 调用close关闭套接字 2.服务器端调 ...
随机推荐
- 2-set奶牛议会
Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 & ...
- 对C#中事件的简单理解
对于C#中的事件,我举了个简单的例子来理解事件及其处理. 这个例子中母亲是事件的发布者,事件是吃饭了.儿子和父亲是事件的订阅者,各自的Eat方法是处理事件的方法. 下面是详细的加注的例子: using ...
- PostgreSQL - 如何杀死被锁死的进程
前言 在一次系统迭代后用户投诉说无法成功登陆系统,经过测试重现和日志定位,最后发现是由于用户在ui上进行了某些操作后,触发了堆栈溢出异常,导致数据库里的用户登陆信息表的数据被锁住,无法释放.这个表里存 ...
- mapred-site.xml 基本配置参考
说明:这是hadoop2.x版本的参数.下面的value都是参数默认值. 常用配置: ♥♥♥ .mapreduce.job.hdfs-servers value:${fs.defaultFS} 说明: ...
- 走进JavaWeb技术世界6:Tomcat5总体架构剖析
本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4.Tomcat 的基本设计思路和架构是具有一定连续性的. Tomcat 总体结构 Tomcat 的结构很复杂, ...
- Echarts 常用API之action行为
一.Echarts中的action echarts中支持的图表行为,通过dispatchAction触发. 1.highlight 高亮指定的数据图形 dispatchAction({ type: ' ...
- ML_Review_SVM(Ch9)
Note sth about SVM(Support Vector Machine) 支持向量机(SVM)从入门到放弃再到掌握这篇博客讲得挺仔细. 动机: SVM的中文名字--支持向量机.本质是一 ...
- [Java]某日期时间加上若干分钟得到新的日期时间
使用Java自带类库实现日期时间增减还是比自己人工拆分编写要牢靠,代码也简洁多了. 下面代码实现了在原有日期时间上加上一些分钟得到新的日期时间的功能,稍加改造还可以实现逆向运算. 代码: packag ...
- Request模块入门学习
使用指令npm install --save request来安装模块,然后使用var request = require('request')完成引用. 对于GET请求,主要是获取目的url中数据. ...
- 用html+css+js实现一个无限级树形控件
https://blog.csdn.net/cc_fys/article/details/81284638 树形菜单示例: <!DOCTYPE html> <head> < ...