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

实现功能:循环读取服务器端上的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);
}

运行效果截图:

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

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

(--------------完---------------)


你可能感兴趣的:(qt)