您的位置:首页 > 编程语言 > Qt开发

使用Qt将一系列图片通过网络发送到客户端动态显示的参考代码(修改一下可以用作远程网络监控)。

2013-07-28 09:26 1066 查看
实现功能:循环读取服务器端上的10张图片并通过网络发送到客户端,客户端实现动态显示。

代码如下:

服务器端-----------》

/*************ServerMain.cpp***************/

#include "ServerStream.h"
#include <QtGui/QApplication>

int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ServerStream stream;
return a.exec();
}


/**************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


/****************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++);
}
}


运行效果截图:



客户端------------------》

/**************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();
}


/*****************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


/********************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);
}


运行效果截图:





(--------------完---------------)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐