- 浏览: 3445993 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序。
A
转载:http://mobile.51cto.com/symbian-270781_1.htm
Qt TCP协议 传输简单字符串实例是本文要介绍的内容。TCP即Transmission Control Protocol,传输控制协议。与UDP不同,它是面向连接和数据流的可靠传输协议。也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用TCP协议。
TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序。我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出newConnection()信号,我们可以关联这个信号到我们自己的槽函数,进行数据的发送。而在客户端,一旦有数据到来就会发出readyRead()信号,我们可以关联此信号,进行数据的接收。其实,在程序中最难理解的地方就是程序的发送和接收了,为了让大家更好的理解,我们在这一节只是讲述一个传输简单的字符串的例子,在下一节再进行扩展,实现任意文件的传输。
一、服务器端。
在服务器端的程序中,我们监听本地主机的一个端口,这里使用6666,然后我们关联newConnection()信号与自己写的sendMessage()槽函数。就是说一旦有客户端的连接请求,就会执行sendMessage()函数,在这个函数里我们发送一个简单的字符串。
1.我们新建Qt4 Gui Application,工程名为“tcpServer”,选中QtNetwork模块,Base class选择QWidget。(说明:如果一些Qt Creator版本没有添加模块一项,我们就需要在工程文件tcpServer.pro中添加一行代码:QT += network)
2.我们在widget.ui的设计区添加一个Label,更改其objectName为statusLabel,用于显示一些状态信息。如下:
3.在widget.h文件中做以下更改。
添加头文件:#include <QtNetWork>
添加private对象:QTcpServer *tcpServer;
添加私有槽函数:
- private slots:
- void sendMessage();
4.在widget.cpp文件中进行更改。在其构造函数中添加代码:
- tcpServer = new QTcpServer(this);
- if(!tcpServer->listen(QHostAddress::LocalHost,6666))
- { //监听本地主机的6666端口,如果出错就输出错误信息,并关闭
- qDebug() << tcpServer->errorString();
- close();
- }
- connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));
- //连接信号和相应槽函数
我们在构造函数中使用tcpServer的listen()函数进行监听,然后关联了newConnection()和我们自己的sendMessage()函数。下面我们实现sendMessage()函数。
- void Widget::sendMessage()
- {
- QByteArray block; //用于暂存我们要发送的数据
- QDataStream out(&block,QIODevice::WriteOnly);
- //使用数据流写入数据
- out.setVersion(QDataStream::Qt_4_6);
- //设置数据流的版本,客户端和服务器端使用的版本要相同
- out<<(quint16) 0;
- out<<tr(“hello Tcp!!!”);
- out.device()->seek(0);
- out<<(quint16) (block.size() – sizeof(quint16));
- QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
- //我们获取已经建立的连接的子套接字
- connect(clientConnection,SIGNAL(disconnected()),clientConnection,
- SLOT(deleteLater()));
- clientConnection->write(block);
- clientConnection->disconnectFromHost();
- ui->statusLabel->setText(“send message successful!!!”);
- //发送数据成功后,显示提示
- }
这个是数据发送函数,我们主要介绍两点:
(1)为了保证在客户端能接收到完整的文件,我们都在数据流的最开始写入完整文件的大小信息,这样客户端就可以根据大小信息来判断是否接受到了完整的文件。而在服务器端,我们在发送数据时就要首先发送实际文件的大小信息,但是,文件的大小一开始是无法预知的,所以我们先使用了out<<(quint16) 0;在block的开始添加了一个quint16大小的空间,也就是两字节的空间,它用于后面放置文件的大小信息。然后out<<tr(“hello Tcp!!!”);输入实际的文件,这里是字符串。当文件输入完成后我们在使用out.device()->seek(0);返回到block的开始,加入实际的文件大小信息,也就是后面的代码,它是实际文件的大小:out<<(quint16) (block.size() – sizeof(quint16));
(2)在服务器端我们可以使用tcpServer的nextPendingConnection()函数来获取已经建立的连接的Tcp套接字,使用它来完成数据的发送和其它操作。比如这里,我们关联了disconnected()信号和deleteLater()槽函数,然后我们发送数据
- clientConnection->write(block);
然后是clientConnection->disconnectFromHost();它表示当发送完成时就会断开连接,这时就会发出disconnected()信号,而最后调用deleteLater()函数保证在关闭连接后删除该套接字clientConnection。
5.这样服务器的程序就完成了,我们先运行一下程序。
我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务器发送的数据。
1.我们新建Qt4 Gui Application,工程名为“tcpClient”,选中QtNetwork模块,Base class选择QWidget。
2,我们在widget.ui中添加几个标签Label和两个Line Edit以及一个按钮Push Button。
其中“主机”后的Line Edit的objectName为hostLineEdit,“端口号”后的为portLineEdit。“收到的信息”标签的objectName为messageLabel 。
3.在widget.h文件中做更改。
添加头文件:#include <QtNetwork>
添加private变量:
- QTcpSocket *tcpSocket;
- QString message; //存放从服务器接收到的字符串
- quint16 blockSize; //存放文件的大小信息
添加私有槽函数:
- private slots:
- void newConnect(); //连接服务器
- void readMessage(); //接收数据
- void displayError(QAbstractSocket::SocketError); //显示错误
4.在widget.cpp文件中做更改。
(1)在构造函数中添加代码:
- tcpSocket = new QTcpSocket(this);
- connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
- connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
- this,SLOT(displayError(QAbstractSocket::SocketError)));
这里关联了tcpSocket的两个信号,当有数据到来时发出readyRead()信号,我们执行读取数据的readMessage()函数。当出现错误时发出error()信号,我们执行displayError()槽函数。
(2)实现newConnect()函数。
- void Widget::newConnect()
- {
- blockSize = 0; //初始化其为0
- tcpSocket->abort(); //取消已有的连接
- tcpSocket->connectToHost(ui->hostLineEdit->text(),
- ui->portLineEdit->text().toInt());
- //连接到主机,这里从界面获取主机地址和端口号
- }
这个函数实现了连接到服务器,下面会在“连接”按钮的单击事件槽函数中调用这个函数。
(3)实现readMessage()函数。
- void Widget::readMessage()
- {
- QDataStream in(tcpSocket);
- in.setVersion(QDataStream::Qt_4_6);
- //设置数据流版本,这里要和服务器端相同
- if(blockSize==0) //如果是刚开始接收数据
- {
- //判断接收的数据是否有两字节,也就是文件的大小信息
- //如果有则保存到blockSize变量中,没有则返回,继续接收数据
- if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
- in >> blockSize;
- }
- if(tcpSocket->bytesAvailable() < blockSize) return;
- //如果没有得到全部的数据,则返回,继续接收数据
- in >> message;
- //将接收到的数据存放到变量中
- ui->messageLabel->setText(message);
- //显示接收到的数据
- }
这个函数实现了数据的接收,它与服务器端的发送函数相对应。首先我们要获取文件的大小信息,
- void Widget::displayError(QAbstractSocket::SocketError)
- {
- qDebug() << tcpSocket->errorString(); //输出错误信息
- }
然后根据文件的大小来判断是否接收到了完整的文件。
(4)实现displayError()函数。
这里简单的实现了错误信息的输出。
(5)我们在widget.ui中进入“连接”按钮的单击事件槽函数,然后更改如下。
- void Widget::on_pushButton_clicked() //连接按钮
- {
- newConnect(); //请求连接
- }
这里直接调用了newConnect()函数。
5.我们运行程序,同时运行服务器程序,然后在“主机”后填入“localhost”,在“端口号”后填入“6666”,点击“连接”按钮,效果如下。
可以看到我们正确地接收到了数据。因为服务器端和客户端是在同一台机子上运行的,所以我这里填写了“主机”为“localhost”,如果你在不同的机子上运行,需要在“主机”后填写其正确的IP地址。
小结:Qt TCP协议传输简单字符串实例,到这里我们最简单的TCP应用程序就完成了,在下一节我们将会对它进行扩展,实现任意文件的传输。
发表评论
-
更换博客地址告示
2012-12-03 18:56 2591更换博客地址告示 ... -
收款主页设计
2012-11-17 11:01 0文档信息 版权声明:自由转载-非商用-非衍生- ... -
10个精选国外免费空间
2012-11-12 16:06 6329最近想申请一个免费空间,发现国内基本没有。。。。唉。 ... -
长光所考博信息
2012-09-24 14:25 2699总结一下,以后有个奔头。。搞科研的收入太微薄了。唉。。。 ... -
The file contains a character that cannot be represented in the current code pag
2012-08-17 10:17 6325vs2008 打开网上下载的Qt项目,结果编译时无法通过,出 ... -
64位操作系统,编译程序出现X86和X64的冲突
2012-08-16 20:10 0问题1:1>QtGuid4.lib(QtGuid4.d ... -
通用日志系统开发【转】
2012-08-06 15:20 42411.前言 中大型软件项 ... -
U盘制作WinPE系统【转】
2012-07-27 11:36 2522不带光驱的笔记本的网友和没有光驱的台式机的网友如何安 ... -
博客文章标题横线框
2012-06-28 11:47 0分析 ... -
触摸屏介绍
2012-05-30 16:03 1979有一个项目,需要购买一台触摸屏设备。 了解一下触摸屏的基础知 ... -
有谁知道高速大数据量无线传输技术
2012-05-28 11:53 2506有谁知道高速大数据量无线传输技术? 想了解一下无线传输 ... -
自由在博客里插入广告,有钱你不赚吗???
2012-05-25 18:37 01、一直在ITeye里写技 ... -
自由在博客里插入广告,有钱你不赚吗???
2012-05-25 15:22 6632其实这些广告也没啥意 ... -
支持javascript的博客汇总
2012-05-25 09:27 2485写这篇文章的目的主要是为想在公共博客上布置广告的朋友提供一些参 ... -
支持js代码的博客有哪些?
2012-05-25 09:20 32971、支持js代码的博客谷歌博客, 雅虎奇摩,博客大巴,jimd ... -
VS2008无法下断点调试的原因
2012-05-02 11:18 19327VS2008单步调试时出错,原来的断点处显示一个空心圆加 ... -
VS2008无法下断点调试的若干解决办法
2012-05-02 09:19 4039我使用了第一种方法,暂时恢复了断点调试。 调试程 ... -
【转】串口通讯—通信协议
2012-02-29 00:11 2640转:http://cs.nju.edu.cn/y ... -
Ankhsvn 改名出错
2012-02-16 18:32 3173总结只改变文件名字大小写的最终解决方法。 这种只需要改 ... -
C++接口实现总结
2012-02-04 14:51 32920网上的例子,稍微有点错误。我给更改一下,附件上有源码!如有错误 ...
相关推荐
在"Qt TCP协议 传输简单字符串实例"中,我们将关注如何在Qt环境中建立一个简单的TCP服务器和客户端,以便它们能够交换字符串数据。 首先,我们需要创建一个TCP服务器。在Qt中,`QTcpServer`类用于监听和接受来自...
QT5中的QTcpSocket类提供了方便的方法来发送和接收字符串。发送字符串时,需要将其转换为QByteArray,然后调用write函数。接收数据时,可以先读取QByteArray,再转换回字符串。 ```cpp // 发送字符串 QString str =...
本文将深入探讨如何在Qt环境中使用TCP套接字进行简单的字符串通信。 标题“QT-tcpsocket简单通信-字符串通信”所涉及的核心知识点是Qt中的QTcpSocket类,它允许我们创建TCP客户端和服务器来交换数据。TCP是一种面向...
TCP即Transmission Control Protocol,...其实,在程序中最难理解的地方就是程序的发送和接收了,为了让大家更好的理解,我们在这一节只是讲述一个传输简单的字符串的例子,在下一节再进行扩展,实现任意文件的传输。
在本文中,我们将深入探讨如何使用Qt库通过TCP协议实现一个简单的服务端和客户端,并加入心跳检测机制。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI应用,同时也支持网络编程,包括TCP通信。 首先,我们要...
本节将详细解析一个基于QT的TCP服务器端程序设计,通过实例演示如何实现简单的字符串传输,进而奠定处理复杂数据的基础。 ##### 服务器端实现步骤: 1. **创建项目**:首先,使用Qt Creator创建一个新的Qt GUI ...
这可能涉及到字符串的分割、JSON或XML解析等。 7. **资源释放**:当线程完成任务后,记得销毁QThread对象,防止内存泄漏。但注意不要直接调用QThread的deleteLater(),因为这可能会导致正在运行的代码崩溃。应在...
在IT领域,网络通信是至关重要的部分,而UDP(User Datagram Protocol)作为一种无连接的、不可靠的传输协议,常用于实时数据交换和低延迟应用。Qt是一个强大的跨平台应用程序开发框架,支持多种网络通信方式,包括...
- Qt和Modbus协议支持多种数据类型,包括浮点型(real/float)、整型(INT、DINT)、布尔型(bool)和字符串型(string)。根据需要将数据转换为Modbus兼容的格式,如将浮点数拆分为两个16位整数,或将字符串拆分为...
QT TCP/IP 服务器是利用QT库来构建网络通信服务端的一种技术,主要涉及网络编程、QT框架以及TCP/IP协议栈的使用。QT是一个跨平台的C++开发框架,广泛应用于图形用户界面、网络通信和多媒体等领域。在描述中提到的...
5. 中文编码处理:使用QTextCodec将字符串转换为字节流,反之亦然。 “文件传输”部分可能涉及文件的分块、打包、校验和验证等步骤,以确保文件完整无误地传输。这可能包括将大文件拆分成小块,每一块单独传输,...
在IT领域,网络通信是应用程序之间交互的重要方式,TCP(Transmission Control Protocol)作为一种面向连接的、可靠的、基于字节流的传输层通信协议,被广泛应用于各种系统和应用中。本项目“Tcp.rar”旨在利用QT...
描述中提到,当接收到包含字母"a"的字符串时,服务器需要返回“连接成功”,否则返回“连接失败”。这涉及到对接收到数据的解析和条件判断。在处理数据的槽函数中,我们可以读取QTcpSocket的接收到的数据,检查是否...
在IT行业中,网络通信是软件开发中的重要环节,TCP(Transmission Control Protocol)作为一种可靠的传输协议,广泛用于数据的发送和接收。在这个例子中,我们关注的是如何通过TCP协议在客户端和服务端之间收发JSON...
属性表单是QT GUI设计的一部分,它允许程序的某些特性(如字符串、整数、布尔值等)可以被直接编辑,从而提供更直观的用户交互。 客户端通常会创建一个`QTcpSocket`实例,然后连接到服务器的IP地址和端口号。一旦...
5. **数据编码与解码**:在进行TCP文本通信时,通常需要将字符串转换为字节流进行传输。QT提供`toUtf8()`和`fromUtf8()`函数,用于UTF-8编码和解码。 6. **错误处理**:在编写TCP通信程序时,必须考虑各种可能的...
**Qt Creator MODBUS TCP客户端读取数据应用软件详解** MODBUS TCP是一种广泛应用于工业自动化领域的通信协议,它基于TCP/IP网络协议,使得设备能够通过网络交换数据。在本项目中,我们将探讨如何使用Qt Creator...
这通常是通过一个信号槽机制来完成的,例如,当QLineEdit的returnPressed()信号触发时,对应的槽函数会收集输入框的内容,将其转换为字符串并发送。 此外,资源还包含了"出版物",表明这个TCP通信应用已经进行了...
我们将详细解释如何在Qt中使用`QTcpServer`和`QTcpSocket`类实现客户端/服务器模型,并通过一个简单的字符串传输案例来展示数据的发送与接收过程。 #### 二、基础知识概述 **1. TCP协议简介** TCP(传输控制协议...