`
qimo601
  • 浏览: 3438544 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt TCP协议 传输简单字符串实例

阅读更多

 

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,用于显示一些状态信息。如下:

Qt TCP协议 传输简单字符串实例


  
3.在widget.h文件中做以下更改。

添加头文件:#include <QtNetWork>

添加private对象:QTcpServer *tcpServer;

添加私有槽函数:

  1. private slots:  
  2. void sendMessage(); 

4.在widget.cpp文件中进行更改。在其构造函数中添加代码:

  1. tcpServer = new QTcpServer(this);  
  2.     if(!tcpServer->listen(QHostAddress::LocalHost,6666))  
  3.     {  //监听本地主机的6666端口,如果出错就输出错误信息,并关闭  
  4.         qDebug() << tcpServer->errorString();  
  5.         close();  
  6.     }  
  7.  connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));  
  8. //连接信号和相应槽函数 

我们在构造函数中使用tcpServer的listen()函数进行监听,然后关联了newConnection()和我们自己的sendMessage()函数。下面我们实现sendMessage()函数。

  1. void Widget::sendMessage()  
  2. {  
  3.     QByteArray block; //用于暂存我们要发送的数据  
  4.     QDataStream out(&block,QIODevice::WriteOnly);  
  5.     //使用数据流写入数据  
  6.     out.setVersion(QDataStream::Qt_4_6);  
  7.     //设置数据流的版本,客户端和服务器端使用的版本要相同  
  8.     out<<(quint16) 0;  
  9.     out<<tr(“hello Tcp!!!”);  
  10.     out.device()->seek(0);  
  11.     out<<(quint16) (block.size() – sizeof(quint16));  
  12.     QTcpSocket *clientConnection = tcpServer->nextPendingConnection();  
  13.     //我们获取已经建立的连接的子套接字  
  14.     connect(clientConnection,SIGNAL(disconnected()),clientConnection,  
  15.             SLOT(deleteLater()));  
  16.     clientConnection->write(block);  
  17.     clientConnection->disconnectFromHost();  
  18.     ui->statusLabel->setText(“send message successful!!!”);  
  19.     //发送数据成功后,显示提示  

这个是数据发送函数,我们主要介绍两点:

(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()槽函数,然后我们发送数据

  1. clientConnection->write(block); 

然后是clientConnection->disconnectFromHost();它表示当发送完成时就会断开连接,这时就会发出disconnected()信号,而最后调用deleteLater()函数保证在关闭连接后删除该套接字clientConnection。

5.这样服务器的程序就完成了,我们先运行一下程序。

Qt TCP协议 传输简单字符串实例


二、客户端。

 

我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务器发送的数据。

1.我们新建Qt4 Gui Application,工程名为“tcpClient”,选中QtNetwork模块,Base class选择QWidget。

2,我们在widget.ui中添加几个标签Label和两个Line Edit以及一个按钮Push Button。

Qt TCP协议 传输简单字符串实例
  
其中“主机”后的Line Edit的objectName为hostLineEdit,“端口号”后的为portLineEdit。“收到的信息”标签的objectName为messageLabel 。

3.在widget.h文件中做更改。

添加头文件:#include <QtNetwork>

添加private变量:

  1. QTcpSocket *tcpSocket;  
  2. QString message;  //存放从服务器接收到的字符串  
  3. quint16 blockSize;  //存放文件的大小信息 

添加私有槽函数:

  1. private slots:  
  2.     void newConnect(); //连接服务器  
  3.     void readMessage();  //接收数据  
  4. void displayError(QAbstractSocket::SocketError);  //显示错误 

4.在widget.cpp文件中做更改。

(1)在构造函数中添加代码:

  1. tcpSocket = new QTcpSocket(this);  
  2. connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));  
  3. connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),  
  4.          this,SLOT(displayError(QAbstractSocket::SocketError))); 

这里关联了tcpSocket的两个信号,当有数据到来时发出readyRead()信号,我们执行读取数据的readMessage()函数。当出现错误时发出error()信号,我们执行displayError()槽函数。

(2)实现newConnect()函数。

  1. void Widget::newConnect()  
  2. {  
  3.     blockSize = 0; //初始化其为0  
  4.     tcpSocket->abort(); //取消已有的连接  
  5.     tcpSocket->connectToHost(ui->hostLineEdit->text(),  
  6.                              ui->portLineEdit->text().toInt());  
  7.     //连接到主机,这里从界面获取主机地址和端口号  

这个函数实现了连接到服务器,下面会在“连接”按钮的单击事件槽函数中调用这个函数。

(3)实现readMessage()函数。

  1. void Widget::readMessage()  
  2. {  
  3.     QDataStream in(tcpSocket);  
  4.     in.setVersion(QDataStream::Qt_4_6);  
  5.     //设置数据流版本,这里要和服务器端相同  
  6.     if(blockSize==0) //如果是刚开始接收数据  
  7.     {  
  8.         //判断接收的数据是否有两字节,也就是文件的大小信息  
  9.         //如果有则保存到blockSize变量中,没有则返回,继续接收数据  
  10.         if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;  
  11.         in >> blockSize;  
  12.     }  
  13.     if(tcpSocket->bytesAvailable() < blockSize) return;  
  14.     //如果没有得到全部的数据,则返回,继续接收数据  
  15.     in >> message;  
  16.     //将接收到的数据存放到变量中  
  17.     ui->messageLabel->setText(message);  
  18.     //显示接收到的数据  

这个函数实现了数据的接收,它与服务器端的发送函数相对应。首先我们要获取文件的大小信息,

  1. void Widget::displayError(QAbstractSocket::SocketError)  
  2. {  
  3.     qDebug() << tcpSocket->errorString(); //输出错误信息  

然后根据文件的大小来判断是否接收到了完整的文件。

(4)实现displayError()函数。

这里简单的实现了错误信息的输出。

(5)我们在widget.ui中进入“连接”按钮的单击事件槽函数,然后更改如下。

  1. void Widget::on_pushButton_clicked() //连接按钮  
  2. {  
  3.     newConnect(); //请求连接  

这里直接调用了newConnect()函数。

5.我们运行程序,同时运行服务器程序,然后在“主机”后填入“localhost”,在“端口号”后填入“6666”,点击“连接”按钮,效果如下。

Qt TCP协议 传输简单字符串实例
  
可以看到我们正确地接收到了数据。因为服务器端和客户端是在同一台机子上运行的,所以我这里填写了“主机”为“localhost”,如果你在不同的机子上运行,需要在“主机”后填写其正确的IP地址。

小结:Qt TCP协议传输简单字符串实例,到这里我们最简单的TCP应用程序就完成了,在下一节我们将会对它进行扩展,实现任意文件的传输。

 

 

 

 

分享到:
评论

相关推荐

    Qt TCP协议

    在"Qt TCP协议 传输简单字符串实例"中,我们将关注如何在Qt环境中建立一个简单的TCP服务器和客户端,以便它们能够交换字符串数据。 首先,我们需要创建一个TCP服务器。在Qt中,`QTcpServer`类用于监听和接受来自...

    QT5 实现TCP通信 客户端与服务端,互相发送字符串;解决乱码问题

    QT5中的QTcpSocket类提供了方便的方法来发送和接收字符串。发送字符串时,需要将其转换为QByteArray,然后调用write函数。接收数据时,可以先读取QByteArray,再转换回字符串。 ```cpp // 发送字符串 QString str =...

    QT-tcpsocket简单通信-字符串通信

    本文将深入探讨如何在Qt环境中使用TCP套接字进行简单的字符串通信。 标题“QT-tcpsocket简单通信-字符串通信”所涉及的核心知识点是Qt中的QTcpSocket类,它允许我们创建TCP客户端和服务器来交换数据。TCP是一种面向...

    Qt5网络编程之TCP协议---实例

    TCP即Transmission Control Protocol,...其实,在程序中最难理解的地方就是程序的发送和接收了,为了让大家更好的理解,我们在这一节只是讲述一个传输简单的字符串的例子,在下一节再进行扩展,实现任意文件的传输。

    Qt使用tcp实现的简单服务端和客户端(带心跳检测)

    在本文中,我们将深入探讨如何使用Qt库通过TCP协议实现一个简单的服务端和客户端,并加入心跳检测机制。Qt是一个跨平台的应用程序开发框架,广泛应用于GUI应用,同时也支持网络编程,包括TCP通信。 首先,我们要...

    QT TCP/UDP 网络编程

    本节将详细解析一个基于QT的TCP服务器端程序设计,通过实例演示如何实现简单的字符串传输,进而奠定处理复杂数据的基础。 ##### 服务器端实现步骤: 1. **创建项目**:首先,使用Qt Creator创建一个新的Qt GUI ...

    QT TCP多线程编程例子

    这可能涉及到字符串的分割、JSON或XML解析等。 7. **资源释放**:当线程完成任务后,记得销毁QThread对象,防止内存泄漏。但注意不要直接调用QThread的deleteLater(),因为这可能会导致正在运行的代码崩溃。应在...

    qt实现udp通讯可收发文字和图片

    在IT领域,网络通信是至关重要的部分,而UDP(User Datagram Protocol)作为一种无连接的、不可靠的传输协议,常用于实时数据交换和低延迟应用。Qt是一个强大的跨平台应用程序开发框架,支持多种网络通信方式,包括...

    Qt使用ModbusTcp与汇川PLC通讯

    - Qt和Modbus协议支持多种数据类型,包括浮点型(real/float)、整型(INT、DINT)、布尔型(bool)和字符串型(string)。根据需要将数据转换为Modbus兼容的格式,如将浮点数拆分为两个16位整数,或将字符串拆分为...

    QT TCP/IP 服务器

    QT TCP/IP 服务器是利用QT库来构建网络通信服务端的一种技术,主要涉及网络编程、QT框架以及TCP/IP协议栈的使用。QT是一个跨平台的C++开发框架,广泛应用于图形用户界面、网络通信和多媒体等领域。在描述中提到的...

    TCP文件传输和TCP通信程序.zip

    5. 中文编码处理:使用QTextCodec将字符串转换为字节流,反之亦然。 “文件传输”部分可能涉及文件的分块、打包、校验和验证等步骤,以确保文件完整无误地传输。这可能包括将大文件拆分成小块,每一块单独传输,...

    Tcp.rar_QT_QT TCP_comfortableb2k_qt tcp 客户端_聊天系统

    在IT领域,网络通信是应用程序之间交互的重要方式,TCP(Transmission Control Protocol)作为一种面向连接的、可靠的、基于字节流的传输层通信协议,被广泛应用于各种系统和应用中。本项目“Tcp.rar”旨在利用QT...

    Qt 线程运行TCP服务器

    描述中提到,当接收到包含字母"a"的字符串时,服务器需要返回“连接成功”,否则返回“连接失败”。这涉及到对接收到数据的解析和条件判断。在处理数据的槽函数中,我们可以读取QTcpSocket的接收到的数据,检查是否...

    TCP.rar_QT TCP

    属性表单是QT GUI设计的一部分,它允许程序的某些特性(如字符串、整数、布尔值等)可以被直接编辑,从而提供更直观的用户交互。 客户端通常会创建一个`QTcpSocket`实例,然后连接到服务器的IP地址和端口号。一旦...

    QT开发:TCP文本通信

    5. **数据编码与解码**:在进行TCP文本通信时,通常需要将字符串转换为字节流进行传输。QT提供`toUtf8()`和`fromUtf8()`函数,用于UTF-8编码和解码。 6. **错误处理**:在编写TCP通信程序时,必须考虑各种可能的...

    TCP收发json. 客户端和服务端

    在IT行业中,网络通信是软件开发中的重要环节,TCP(Transmission Control Protocol)作为一种可靠的传输协议,广泛用于数据的发送和接收。在这个例子中,我们关注的是如何通过TCP协议在客户端和服务端之间收发JSON...

    Qt creator MODBUS TCP客户端读取数据应用软件(附带详细说明)

    **Qt Creator MODBUS TCP客户端读取数据应用软件详解** MODBUS TCP是一种广泛应用于工业自动化领域的通信协议,它基于TCP/IP网络协议,使得设备能够通过网络交换数据。在本项目中,我们将探讨如何使用Qt Creator...

    Qt Tcp通讯发送文字、文件QTcpsocket、QTcpserver

    例如,在发送文本时,我们可以创建一个QTcpSocket实例,连接到服务器,然后将字符串转换为QByteArray并调用`write()`方法: ```cpp QTcpSocket *socket = new QTcpSocket(this); socket-&gt;connectToHost("服务器IP",...

    Tcp通信(基于QT5.13 + TCP + 服务端 + 客户端)

    这通常是通过一个信号槽机制来完成的,例如,当QLineEdit的returnPressed()信号触发时,对应的槽函数会收集输入框的内容,将其转换为字符串并发送。 此外,资源还包含了"出版物",表明这个TCP通信应用已经进行了...

Global site tag (gtag.js) - Google Analytics