用Qt做开发10年了,其中做过好多项目,基于现在web和移动互联网发展如此迅猛,大量的应用场景需要一个网络中转服务器,可以实现手机app或者其他客户端远程回控设备,现在物联网发展非常迅猛,这个将来也是大势所趋,所以有这个想法很久了,打算用Qt也来做个简单的网络中转服务器。 需求场景: 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
一、前言
二、代码思路
#include "tcpserver1.h" #include "quiwidget.h" TcpClient1::TcpClient1(QObject *parent) : QTcpSocket(parent) { ip = "127.0.0.1"; port = 6907; deviceID = "SSJC00000001"; connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(deleteLater())); connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater())); connect(this, SIGNAL(readyRead()), this, SLOT(readData())); } void TcpClient1::setIP(const QString &ip) { this->ip = ip; } QString TcpClient1::getIP() const { return this->ip; } void TcpClient1::setPort(int port) { this->port = port; } int TcpClient1::getPort() const { return this->port; } QString TcpClient1::getDeviceID() { return this->deviceID; } void TcpClient1::readData() { QByteArray data = this->readAll(); if (data.length() <= 0) { return; } //取出唯一标识符,并过滤,可自行更改过滤条件 QByteArray cmd = data.mid(App::CmdStart1, App::CmdLen1); QString id = QString(cmd); if (id.startsWith("S") && deviceID != id) { deviceID = id; //发送信号更新标识符 emit receiveDeviceID(ip, port, deviceID); } QString buffer; if (App::HexData1) { buffer = QUIHelper::byteArrayToHexStr(data); } else { buffer = QString(data); } emit receiveData(ip, port, deviceID, buffer); } void TcpClient1::sendData(const QString &data) { QByteArray buffer; if (App::HexData1) { buffer = QUIHelper::hexStrToByteArray(data); } else { buffer = data.toLatin1(); } this->write(buffer); emit sendData(ip, port, deviceID, data); } TcpServer1::TcpServer1(QObject *parent) : QTcpServer(parent) { } #if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) void TcpServer1::incomingConnection(qintptr handle) #else void TcpServer1::incomingConnection(int handle) #endif { TcpClient1 *client = new TcpClient1(this); client->setSocketDescriptor(handle); connect(client, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(client, SIGNAL(sendData(QString, int, QString, QString)), this, SIGNAL(sendData(QString, int, QString, QString))); connect(client, SIGNAL(receiveData(QString, int, QString, QString)), this, SIGNAL(receiveData(QString, int, QString, QString))); connect(client, SIGNAL(receiveDeviceID(QString, int, QString)), this, SIGNAL(receiveDeviceID(QString, int, QString))); QString ip = client->peerAddress().toString(); int port = client->peerPort(); QString deviceID = client->getDeviceID(); client->setIP(ip); client->setPort(port); emit clientConnected(ip, port, deviceID); emit sendData(ip, port, deviceID, "客户端上线"); //追加到链表中 clients.append(client); } void TcpServer1::disconnected() { TcpClient1 *client = (TcpClient1 *)sender(); QString ip = client->getIP(); int port = client->getPort(); QString deviceID = client->getDeviceID(); emit clientDisconnected(ip, port, deviceID); emit sendData(ip, port, deviceID, "客户端下线"); //断开连接后从链表中移除 clients.removeOne(client); } bool TcpServer1::start() { #if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) bool ok = listen(QHostAddress::AnyIPv4, App::ListenPort1); #else bool ok = listen(QHostAddress::Any, App::ListenPort1); #endif return ok; } void TcpServer1::stop() { foreach (TcpClient1 *client, clients) { client->disconnectFromHost(); } this->close(); } bool TcpServer1::writeData(const QString &deviceID, const QString &data) { bool ok = false; foreach (TcpClient1 *client, clients) { if (client->getDeviceID() == deviceID) { client->sendData(data); ok = true; } } return ok; }
三、效果图
四、开源主页
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算