Qt TCP 通讯简单案例

TCP

简介:

  • TCP 是一个面向数据流和连接的可靠传输协议。

    QTcpSocket类为TCP提供了一个接口,继承自QAbstractSocket。

    可以使用QTcpSocket来实现POP3\SMTP\NNTP 等标准的网络协议。

    与UdpSocket 传输的数据报不同,QTcpSocket传输的是连续的数据流,尤其适合于连续的数据传输。

连接:

1、在任何数据传输之前,必须建立一个TCP连接到远程的主机和端口上。一旦建立连接,peer(对使用TCP协议连接在一起的主机的通称)的IP地址和端口 可以用

QTcpSocket::peerAddress()

QTcpSocket::peerPort()

来获取。

2、在任何时间peer都可以关闭连接,传输会立即终止。

读写:

写:QTcpSocket::write()

读:QTcpSocket::read()

是否有数据可读: QTcpSocket::bytesAvailable()

通信:

使用QTcpServer类:

  • 设置服务器:QTcpServer::listen()

  • 关联信号:QTcpServer::newConnection()

  • 接收连接:QTcpServer :: nextPendingConection()

  • 在同步模式下, 要注意阻塞的问题。

服务端案例:

1、建立Qt gui 工程。项目名称tcpServer, 类名:Server

2、tcpServer.pro 文件中添加“QT+=network”

3、server.ui 中添加控件。

4、编写server.h

添加类的前置声明:class QTcpServer;

添加私有对象定义: QTcpServer *tcpServer;

添加私有槽声明: void sendMessage();

5、编写server.cpp

添加头文件 #include <QtNetwork>

改写构造函数:

tcpServer = new QTcpServer(this);

// 使用了IPv4的本地主机地址,等价于QHostAddress("127.0.0.1")
if (!tcpServer->listen(QHostAddress::LocalHost, 6666)) {
    qDebug() << tcpServer->errorString();
    close();
}
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessage()));

添加发送信息槽的实现代码:

   void Server::sendMessage()

{
// 用于暂存我们要发送的数据
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
// 设置数据流的版本,客户端和服务器端使用的版本要相同
out.setVersion(QDataStream::Qt_4_0);
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->label->setText(“send message successful!!!”);
}

在这里插入图片描述

客户端案例:

1、建立Qt gui 工程。项目名称tcpClient, 类名:Client2、tcpClient.pro 文件中添加“QT+=network”3、client.ui 中添加控件。4、编写client.h 添加头文件: #include

添加类的前置声明:class QTcpSocket;
添加私有对象定义: QTcpSocket *tcpSocket;

 QString message;
// 用来存放数据的大小信息
quint16 blockSize;

添加私有槽声明:
void newConnect();
void readMessage();
void displayError(QAbstractSocket::SocketError
void on_connectButton_clicked();

5、编写client.cpp
添加头文件 #include

改写构造函数:

tcpSocket = new QTcpSocket(this);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
        this, SLOT(displayError(QAbstractSocket::SocketError)));

信号槽程序:

void Client::newConnect()
{    
	// 初始化数据大小信息为0    blockSize = 0;  
	 // 取消已有的连接   
	tcpSocket->abort();     
	tcpSocket->connectToHost(ui->hostLineEdit->text(),                             
                   ui->portLineEdit->text().toInt());  
	if(!socket->waitForConnected(30000))  
	{  
	 	qDebug()<<tr("连接服务器失败,请重新操作!"); 
	}   
	else  
	{     
	qDebug()<<tr("连接服务器成功!");        	     QMessageBox::warning(this,tr("连接提示"),tr("连接服务器成功!"),QMessageBox::Yes,QMessageBox::No); 
		 
	} 
}
void Client::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;
    // 显示接收到的数据
    qDebug() << message;
    ui->messageLabel->setText(message);
}

客户端界面:
在这里插入图片描述

连接地址:资源Qt5 Socket 简单通讯实例,本人在做上位机开发的时候,简单做的一个案例,可实现客户端和服务端的收发。 案例简单实用,供参考。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值