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 简单通讯实例,本人在做上位机开发的时候,简单做的一个案例,可实现客户端和服务端的收发。 案例简单实用,供参考。