linux 接收文件+调用python脚本

来源:互联网 发布:mac 升级后切换花屏 编辑:程序博客网 时间:2024/05/20 23:59

继续接着上一篇socket传送消息的程序。今天实现了从windows接收kinect截图然后利用socket发送到linux。发图片到linux主要是因为这上面有个GPU可以用来跑caffe的深度学习网络,然后把分析结果再发回windows的程序。

接收图片

对应于之前windows端的发送代码,在qt程序中加了一段接收图片的代码是这样的:

char buffer[MAX_MSG_SIZE];/* 缓冲区*/    FILE *stream;    unsigned long long file_size=0;    int res;    if((res=recv(cli_sockfd,(char *)&file_size,sizeof(unsigned long long)+1,0))==-1) //接受数据    {          emit sendData("失去连接");          return;    }else{       // unsigned short maxvalue=file_size;       qDebug()<<file_size;       stream = fopen("../images/cut.png","w");       DWORD dwNumberofBytesRecv=0;       DWORD dwCountofBytesRecv=0;       memset(buffer,0,MAX_MSG_SIZE);       do{           dwNumberofBytesRecv=recv(cli_sockfd,buffer,sizeof(buffer),0);           fwrite(buffer,sizeof(char),dwNumberofBytesRecv,stream); //按字节写入图片           dwCountofBytesRecv+=dwNumberofBytesRecv;       }while(file_size-dwCountofBytesRecv);       emit sendData("文件接收成功");       fclose(stream);

仍然是先接收到文件的总大小,然后根据图片大小接收图片。这其中的这一段是比较重要的写入文件操作。

fwrite(buffer,sizeof(char),dwNumberofBytesRecv,stream);

调用python脚本

这一段是比较纠结的,之前我在VS里面调用过python程序,就是调用模块乱七八糟的,很复杂,一不小心就找不到模块,然后还经常加载不了其他路径上的库文件,而且像caffe,faster rcnn这种又需要依赖大量的库,调了半个早上实在是心累,遂决定用简单粗暴的方法就是:

直接在qt里面调用shell执行python程序,就是酱:QProcess::execute(“python democy.py”);

哈哈,爽飞了有没有!在python程序中写一段代码把结果写入txt文件,然后调用完程序直接读txt文件,把结果取出来,就可以避免乌七八糟地调python,但是这样做的坏处是,每次都得初始化caffe网络,就有点慢了,下次还是钻研下怎么搞。调用完后直接读结果然后用socket发出去:

       QProcess::execute("python democy.py");       QFile f("cut.txt");       if(!f.open(QIODevice::ReadOnly | QIODevice::Text))       {           qDebug() << "Open failed." ;       }       QTextStream txtInput(&f);       QString lineStr;       while(!txtInput.atEnd())       {           lineStr = txtInput.readLine();           emit sendData(lineStr);       }       char msg[MAX_MSG_SIZE];/* 缓冲区*/       QString flag="sendResult";       QByteArray ba = flag.toLatin1();       char *mm = ba.data();       strcpy(msg,mm);       //发送结果标志位       if(send(cli_sockfd,msg,sizeof(msg),0)==-1){           /*发送数据*/           emit sendData("发送失败");       }else{            memset(msg,0,MAX_MSG_SIZE);            emit sendData("准备发送计算结果");       }       //发送结果       ba = lineStr.toLatin1();       mm = ba.data();       strcpy(msg,mm);       if(send(cli_sockfd,msg,sizeof(msg),0)==-1){           /*发送数据*/           emit sendData("发送失败");       }else{            memset(msg,0,MAX_MSG_SIZE);            emit sendData("已经发送计算结果");       }       f.close();

windows接收程序

windows端主要是对应写一个接收结果字符串,然后把它分割再取出写入文本框程序。

原创粉丝点击