使用Qt将一系列图片通过网络发送到客户端动态显示的参考代码(修改一下可以用作远程网络监控)
2017-08-11 10:55
483 查看
实现功能:循环读取服务器端上的10张图片并通过网络发送到客户端,客户端实现动态显示。
代码如下:
服务器端-----------》
[cpp] view
plain copy
/*************ServerMain.cpp***************/
#include "ServerStream.h"
#include <QtGui/QApplication>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ServerStream stream;
return a.exec();
}
[cpp] view
plain copy
/**************ServerStream.h***************/
#ifndef IMAGESERVER_H_
#define IMAGESERVER_H_
#include <iostream>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
#include <QtGui/QImage>
#include <QtCore/QThread>
#include <QtGui/QWidget>
class ServerStream : public QObject {
Q_OBJECT
private:
QTcpServer server;
QTcpSocket *socket; //socket对象
void initNetWork();
void delay(int len);
public:
ServerStream(QObject *parent=0);
~ServerStream();
QByteArray formHead(QByteArray by);
public slots:
void dealConnection();
};
#endif
[cpp] view
plain copy
/****************ServerStream.cpp*****************/
#include "ServerStream.h"
#include <string>
#include <QtCore/QFile>
#include <QtCore/QThread>
ServerStream::ServerStream(QObject *parent) : QObject(parent)
{
initNetWork();
connect(&server,SIGNAL(newConnection()),this,SLOT(dealConnection()));
}
ServerStream::~ServerStream(){
}
//初始化网络
void ServerStream::initNetWork(){
std::cout<<"initing network..."<<std::endl;
server.setParent(this);
server.listen(QHostAddress::Any,8867);
std::cout<<"network inited!"<<std::endl;
}
//当有连接时,将图片发送过去
void ServerStream::dealConnection(){
int num=0;
long len=0;
socket=server.nextPendingConnection();
for(num=1;num<=10;num++){
QFile file("/images/"+QString::number(num)+".jpg");
file.open(QIODevice::ReadOnly); //在Qt中,文件需要打开了才能进行操作,这点与java不同
QByteArray by;
by=file.readAll();
len=by.length(); //获取数据的总长度
by.prepend(formHead(QByteArray::number((qlonglong)len))); //将要发送的数据总长度加在数据的最前10个字节中,不足的在前面补零。
len=socket->write(by);
socket->flush();
std::cout<<len<<"bytes have been written!"<<std::endl;
delay(7000);
if(num==10) num=1;
}
}
//将数据长度封装在10个字节的范围内,不足的在前面补零
QByteArray ServerStream::formHead(QByteArray by){
int len=by.length();
int i=0;
for(i=10-len;i>0;i--){
by=by.prepend('0');
}
return by;
}
//线程延时不能用,只好用最原始的延时方法了
void ServerStream::delay(int len){
volatile int m=0;
volatile int n=0;
for(m=0;m<len;m++){
for(n=0;n<len;n++);
}
}
运行效果截图:
客户端------------------》
[cpp] view
plain copy
/**************Main.cpp******************/
#include "ImageStream.h"
#include <QtGui/QApplication>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ImageStream *is=new ImageStream();
is->show();
return a.exec();
}
[cpp] view
plain copy
/*****************ImageStream.h***********************/
#ifndef IMAGESTREAM_H_
#define IMAGESTREAM_H_
#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <iostream>
#include <QtGui/QPalette>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QTcpSocket>
class ImageStream : public QWidget{
Q_OBJECT
private:
QHostAddress hostAddress; //主机地址
QTcpSocket client; //socket对象
QLabel *ql_show;
QByteArray imageData; //存放接收到的图片数据的QByteArray
bool hasReadHead; //是否接收到了当前所接收图片的第一个数据包。
long avalibleNum;
void initNetWork();
public:
ImageStream(QWidget *qw=0);
~ImageStream();
void changeFace();
public slots:
void getSocketImage(); //获取从服务器端传来的图片数据
};
#endif
[cpp] view
plain copy
/********************ImageStream.cpp***********************/
#include "ImageStream.h"
#include <QtCore/QFile>
#include <QtCore/QByteArray>
ImageStream::ImageStream(QWidget *qw) : QWidget(qw){
initNetWork();
this->setGeometry(0,0,500,400);
ql_show=new QLabel(this);
ql_show->setGeometry(50,50,400,300);
ql_show->setAutoFillBackground(true);
hasReadHead=false;
avalibleNum=0;
}
ImageStream::~ImageStream(){
}
//当有数据包发送来时,解析第一个数据包并获取所有数据包的总长度,获取的第二个以上的数据包不做此处理。
void ImageStream::getSocketImage(){
if(!hasReadHead){
imageData.clear(); //第一个数据包发来时,先清空存储图片数据的空间
QByteArray by=client.readAll();
avalibleNum=by.left(10).toLong(); //找出第一个数据包的前10个字节,由此获得数据总长度。
by.remove(0,10); //移除前10个字节
imageData.append(by);
hasReadHead=true;
if(imageData.length()>=avalibleNum){ //判断数据是否接收完毕
std::cout<<"receive a image,length="<<avalibleNum<<std::endl;
changeFace();
hasReadHead=false;
}
}else{
QByteArray by=client.readAll();
imageData.append(by);
if(imageData.length()>=avalibleNum){ //判断数据是否接收完毕
std::cout<<"receive a image,length="<<avalibleNum<<std::endl;
changeFace();
hasReadHead=false;
}
}
}
void ImageStream::changeFace(){
QPalette palette;
QImage image=QImage::fromData(imageData,"jpg");
palette.setBrush(QPalette::Background, QBrush(image));
ql_show->setPalette(palette);
}
void ImageStream::initNetWork(){
std::cout<<"initing network"<<std::endl;
hostAddress.setAddress("172.23.33.61");
client.setParent(this);
client.connectToHost(hostAddress, 8867);
connect(&client,SIGNAL(readyRead()),this,SLOT(getSocketImage()));
std::cout<<"network inited!"<<std::endl;
client.setReadBufferSize(1024*1024);
}
运行效果截图:
(--------------完---------------)
代码如下:
服务器端-----------》
[cpp] view
plain copy
/*************ServerMain.cpp***************/
#include "ServerStream.h"
#include <QtGui/QApplication>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ServerStream stream;
return a.exec();
}
[cpp] view
plain copy
/**************ServerStream.h***************/
#ifndef IMAGESERVER_H_
#define IMAGESERVER_H_
#include <iostream>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
#include <QtGui/QImage>
#include <QtCore/QThread>
#include <QtGui/QWidget>
class ServerStream : public QObject {
Q_OBJECT
private:
QTcpServer server;
QTcpSocket *socket; //socket对象
void initNetWork();
void delay(int len);
public:
ServerStream(QObject *parent=0);
~ServerStream();
QByteArray formHead(QByteArray by);
public slots:
void dealConnection();
};
#endif
[cpp] view
plain copy
/****************ServerStream.cpp*****************/
#include "ServerStream.h"
#include <string>
#include <QtCore/QFile>
#include <QtCore/QThread>
ServerStream::ServerStream(QObject *parent) : QObject(parent)
{
initNetWork();
connect(&server,SIGNAL(newConnection()),this,SLOT(dealConnection()));
}
ServerStream::~ServerStream(){
}
//初始化网络
void ServerStream::initNetWork(){
std::cout<<"initing network..."<<std::endl;
server.setParent(this);
server.listen(QHostAddress::Any,8867);
std::cout<<"network inited!"<<std::endl;
}
//当有连接时,将图片发送过去
void ServerStream::dealConnection(){
int num=0;
long len=0;
socket=server.nextPendingConnection();
for(num=1;num<=10;num++){
QFile file("/images/"+QString::number(num)+".jpg");
file.open(QIODevice::ReadOnly); //在Qt中,文件需要打开了才能进行操作,这点与java不同
QByteArray by;
by=file.readAll();
len=by.length(); //获取数据的总长度
by.prepend(formHead(QByteArray::number((qlonglong)len))); //将要发送的数据总长度加在数据的最前10个字节中,不足的在前面补零。
len=socket->write(by);
socket->flush();
std::cout<<len<<"bytes have been written!"<<std::endl;
delay(7000);
if(num==10) num=1;
}
}
//将数据长度封装在10个字节的范围内,不足的在前面补零
QByteArray ServerStream::formHead(QByteArray by){
int len=by.length();
int i=0;
for(i=10-len;i>0;i--){
by=by.prepend('0');
}
return by;
}
//线程延时不能用,只好用最原始的延时方法了
void ServerStream::delay(int len){
volatile int m=0;
volatile int n=0;
for(m=0;m<len;m++){
for(n=0;n<len;n++);
}
}
运行效果截图:
客户端------------------》
[cpp] view
plain copy
/**************Main.cpp******************/
#include "ImageStream.h"
#include <QtGui/QApplication>
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ImageStream *is=new ImageStream();
is->show();
return a.exec();
}
[cpp] view
plain copy
/*****************ImageStream.h***********************/
#ifndef IMAGESTREAM_H_
#define IMAGESTREAM_H_
#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <iostream>
#include <QtGui/QPalette>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QTcpSocket>
class ImageStream : public QWidget{
Q_OBJECT
private:
QHostAddress hostAddress; //主机地址
QTcpSocket client; //socket对象
QLabel *ql_show;
QByteArray imageData; //存放接收到的图片数据的QByteArray
bool hasReadHead; //是否接收到了当前所接收图片的第一个数据包。
long avalibleNum;
void initNetWork();
public:
ImageStream(QWidget *qw=0);
~ImageStream();
void changeFace();
public slots:
void getSocketImage(); //获取从服务器端传来的图片数据
};
#endif
[cpp] view
plain copy
/********************ImageStream.cpp***********************/
#include "ImageStream.h"
#include <QtCore/QFile>
#include <QtCore/QByteArray>
ImageStream::ImageStream(QWidget *qw) : QWidget(qw){
initNetWork();
this->setGeometry(0,0,500,400);
ql_show=new QLabel(this);
ql_show->setGeometry(50,50,400,300);
ql_show->setAutoFillBackground(true);
hasReadHead=false;
avalibleNum=0;
}
ImageStream::~ImageStream(){
}
//当有数据包发送来时,解析第一个数据包并获取所有数据包的总长度,获取的第二个以上的数据包不做此处理。
void ImageStream::getSocketImage(){
if(!hasReadHead){
imageData.clear(); //第一个数据包发来时,先清空存储图片数据的空间
QByteArray by=client.readAll();
avalibleNum=by.left(10).toLong(); //找出第一个数据包的前10个字节,由此获得数据总长度。
by.remove(0,10); //移除前10个字节
imageData.append(by);
hasReadHead=true;
if(imageData.length()>=avalibleNum){ //判断数据是否接收完毕
std::cout<<"receive a image,length="<<avalibleNum<<std::endl;
changeFace();
hasReadHead=false;
}
}else{
QByteArray by=client.readAll();
imageData.append(by);
if(imageData.length()>=avalibleNum){ //判断数据是否接收完毕
std::cout<<"receive a image,length="<<avalibleNum<<std::endl;
changeFace();
hasReadHead=false;
}
}
}
void ImageStream::changeFace(){
QPalette palette;
QImage image=QImage::fromData(imageData,"jpg");
palette.setBrush(QPalette::Background, QBrush(image));
ql_show->setPalette(palette);
}
void ImageStream::initNetWork(){
std::cout<<"initing network"<<std::endl;
hostAddress.setAddress("172.23.33.61");
client.setParent(this);
client.connectToHost(hostAddress, 8867);
connect(&client,SIGNAL(readyRead()),this,SLOT(getSocketImage()));
std::cout<<"network inited!"<<std::endl;
client.setReadBufferSize(1024*1024);
}
运行效果截图:
(--------------完---------------)
相关文章推荐
- 使用Qt将一系列图片通过网络发送到客户端动态显示的参考代码(修改一下可以用作远程网络监控)。
- 动态设置Button、ImageView等组件在不同状态下的背景/前景显示效果。 扩展下的话可以前景/背景的显示效果可以使用网络图片。
- dskinlite(uieasy mfc界面库)使用记录3:绘制动态元素(按钮控件通过隐藏方式修改图片显示)
- dskinlite(uieasy mfc界面库)使用记录3:绘制动态元素(按钮控件通过隐藏方式修改图片显示)
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览
- ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- 第一次自己写jquery图片延迟加载插件,不通用,但修改一下还是可以使用到很多页面上的
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- 带客户端脚本的图片控件,可利用后台代码修改图片显示(C#代码)
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Python服务端,通过TCP发送一张图片给Android客户端,客户端把图片显示出来
- 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用