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

使用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);  

}  

运行效果截图:





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