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

实现功能:循环读取服务器端上的10张图片并通过网络发送到客户端,客户端实现动态显示。

代码如下:

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

[cpp]  view plain  copy
  1. /*************ServerMain.cpp***************/  
  2.   
  3. #include "ServerStream.h"  
  4. #include <QtGui/QApplication>  
  5.   
  6.   
  7. int main(int argc,char *argv[])  
  8. {  
  9.    QApplication a(argc,argv);  
  10.    ServerStream stream;  
  11.    return a.exec();  
  12. }  

[cpp]  view plain  copy
  1. /**************ServerStream.h***************/  
  2.   
  3. #ifndef IMAGESERVER_H_  
  4. #define IMAGESERVER_H_  
  5.   
  6. #include <iostream>  
  7. #include <QtNetwork/QHostAddress>    
  8. #include <QtNetwork/QTcpSocket>  
  9. #include <QtNetwork/QTcpServer>  
  10. #include <QtGui/QImage>  
  11. #include <QtCore/QThread>  
  12. #include <QtGui/QWidget>  
  13.   
  14.   
  15.   
  16. class ServerStream : public QObject {  
  17.    Q_OBJECT  
  18.    private:  
  19.       QTcpServer server;  
  20.       QTcpSocket *socket;   //socket对象  
  21.       void initNetWork();  
  22.       void delay(int len);  
  23.    public:  
  24.       ServerStream(QObject *parent=0);  
  25.       ~ServerStream();  
  26.       QByteArray formHead(QByteArray by);  
  27.    public slots:  
  28.       void dealConnection();  
  29. };  
  30.   
  31. #endif  

[cpp]  view plain  copy
  1. /****************ServerStream.cpp*****************/  
  2.   
  3. #include "ServerStream.h"  
  4. #include <string>  
  5. #include <QtCore/QFile>  
  6. #include <QtCore/QThread>  
  7.   
  8.   
  9. ServerStream::ServerStream(QObject *parent) : QObject(parent)  
  10. {  
  11.     initNetWork();  
  12.     connect(&server,SIGNAL(newConnection()),this,SLOT(dealConnection()));  
  13. }  
  14.   
  15. ServerStream::~ServerStream(){  
  16.     
  17. }  
  18.   
  19.   
  20. //初始化网络  
  21. void ServerStream::initNetWork(){  
  22.     std::cout<<"initing network..."<<std::endl;  
  23.     server.setParent(this);  
  24.     server.listen(QHostAddress::Any,8867);   
  25.     std::cout<<"network inited!"<<std::endl;  
  26. }  
  27.   
  28. //当有连接时,将图片发送过去  
  29. void ServerStream::dealConnection(){  
  30.     int num=0;  
  31.     long len=0;  
  32.     socket=server.nextPendingConnection();   
  33.     for(num=1;num<=10;num++){  
  34.         QFile file("/images/"+QString::number(num)+".jpg");  
  35.         file.open(QIODevice::ReadOnly);   //在Qt中,文件需要打开了才能进行操作,这点与java不同  
  36.         QByteArray by;  
  37.         by=file.readAll();  
  38.         len=by.length();    //获取数据的总长度  
  39.         by.prepend(formHead(QByteArray::number((qlonglong)len)));  //将要发送的数据总长度加在数据的最前10个字节中,不足的在前面补零。  
  40.         len=socket->write(by);  
  41.         socket->flush();     
  42.         std::cout<<len<<"bytes have been written!"<<std::endl;  
  43.         delay(7000);  
  44.         if(num==10) num=1;  
  45.     }  
  46. }  
  47.   
  48.   
  49. //将数据长度封装在10个字节的范围内,不足的在前面补零  
  50. QByteArray ServerStream::formHead(QByteArray by){  
  51.     int len=by.length();  
  52.     int i=0;  
  53.     for(i=10-len;i>0;i--){  
  54.        by=by.prepend('0');  
  55.     }  
  56.     return by;  
  57. }  
  58.   
  59. //线程延时不能用,只好用最原始的延时方法了  
  60. void ServerStream::delay(int len){  
  61.     volatile int m=0;  
  62.     volatile int n=0;  
  63.     for(m=0;m<len;m++){  
  64.        for(n=0;n<len;n++);  
  65.     }  
  66. }  

运行效果截图:



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

[cpp]  view plain  copy
  1. /**************Main.cpp******************/  
  2.   
  3. #include "ImageStream.h"  
  4. #include <QtGui/QApplication>  
  5.   
  6. int main(int argc,char *argv[])  
  7. {  
  8.    QApplication a(argc,argv);  
  9.    ImageStream *is=new ImageStream();  
  10.    is->show();  
  11.    return a.exec();  
  12. }  

[cpp]  view plain  copy
  1. /*****************ImageStream.h***********************/  
  2.   
  3. #ifndef IMAGESTREAM_H_  
  4. #define IMAGESTREAM_H_  
  5.   
  6. #include <QtGui/QWidget>  
  7. #include <QtGui/QLabel>  
  8. #include <iostream>  
  9. #include <QtGui/QPalette>  
  10. #include <QtNetwork/QHostAddress>    
  11. #include <QtNetwork/QTcpSocket>  
  12.   
  13.   
  14.   
  15. class ImageStream : public QWidget{  
  16.    Q_OBJECT  
  17.    private:  
  18.       QHostAddress hostAddress;   //主机地址  
  19.       QTcpSocket client;   //socket对象  
  20.       QLabel *ql_show;   
  21.       QByteArray imageData;   //存放接收到的图片数据的QByteArray  
  22.       bool hasReadHead;   //是否接收到了当前所接收图片的第一个数据包。  
  23.       long avalibleNum;  
  24.       void initNetWork();  
  25.    public:  
  26.       ImageStream(QWidget *qw=0);  
  27.       ~ImageStream();  
  28.       void changeFace();  
  29.    public slots:  
  30.       void getSocketImage();  //获取从服务器端传来的图片数据  
  31.         
  32. };  
  33.   
  34. #endif  

[cpp]  view plain  copy
  1. /********************ImageStream.cpp***********************/  
  2.   
  3. #include "ImageStream.h"  
  4. #include <QtCore/QFile>  
  5. #include <QtCore/QByteArray>  
  6.   
  7. ImageStream::ImageStream(QWidget *qw) : QWidget(qw){  
  8.     initNetWork();  
  9.     this->setGeometry(0,0,500,400);  
  10.     ql_show=new QLabel(this);  
  11.     ql_show->setGeometry(50,50,400,300);  
  12.     ql_show->setAutoFillBackground(true);  
  13.     hasReadHead=false;  
  14.     avalibleNum=0;  
  15. }  
  16.   
  17.   
  18. ImageStream::~ImageStream(){  
  19.       
  20. }  
  21.   
  22.   
  23.   
  24.   
  25. //当有数据包发送来时,解析第一个数据包并获取所有数据包的总长度,获取的第二个以上的数据包不做此处理。  
  26. void ImageStream::getSocketImage(){  
  27.    if(!hasReadHead){  
  28.       imageData.clear();   //第一个数据包发来时,先清空存储图片数据的空间  
  29.       QByteArray by=client.readAll();     
  30.       avalibleNum=by.left(10).toLong();   //找出第一个数据包的前10个字节,由此获得数据总长度。  
  31.       by.remove(0,10);  //移除前10个字节  
  32.       imageData.append(by);  
  33.       hasReadHead=true;  
  34.       if(imageData.length()>=avalibleNum){   //判断数据是否接收完毕  
  35.          std::cout<<"receive a image,length="<<avalibleNum<<std::endl;  
  36.          changeFace();  
  37.          hasReadHead=false;  
  38.       }  
  39.    }else{  
  40.       QByteArray by=client.readAll();  
  41.       imageData.append(by);  
  42.       if(imageData.length()>=avalibleNum){   //判断数据是否接收完毕  
  43.          std::cout<<"receive a image,length="<<avalibleNum<<std::endl;  
  44.          changeFace();  
  45.          hasReadHead=false;  
  46.       }  
  47.    }  
  48. }  
  49.   
  50.   
  51. void ImageStream::changeFace(){  
  52.   QPalette palette;    
  53.   QImage image=QImage::fromData(imageData,"jpg");  
  54.   palette.setBrush(QPalette::Background, QBrush(image));    
  55.   ql_show->setPalette(palette);    
  56. }  
  57.   
  58. void ImageStream::initNetWork(){  
  59.     std::cout<<"initing network"<<std::endl;  
  60.     hostAddress.setAddress("172.23.33.61");  
  61.     client.setParent(this);  
  62.     client.connectToHost(hostAddress, 8867);  
  63.     connect(&client,SIGNAL(readyRead()),this,SLOT(getSocketImage()));  
  64.     std::cout<<"network inited!"<<std::endl;  
  65.     client.setReadBufferSize(1024*1024);  
  66. }  

运行效果截图:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值