【AllJoyn框架-09】AllJoyn 局域网文件传输(修改官方版本)

下载并编译完alljoyn-14.06源码后,在\build\win7\x86\debug\dist\cpp\samples下生成了了些alljoyn实例,其中就有一个与文件传输有关的FileTransfer。但也许是官方版本有bug(我也确实看到了bug),运行时总是异常,客户端无法收到文件。于是就有了这个修改版,可以实现文件传输了。并且传输方向我更换了,客户端向服务端循环发送文件,服务端等待接收即可。下面是核心实现过程。

客户端

1、创建一接收图片信号,附带两个参数,文件名和字节数组

fileTransferInterface->AddSignal("FileTransfer", "say", "name,data", 0, 0);

2、客户端的main中,接入会话后,循环发送图片即可

if (ER_OK == status) {
        while (1) {
            busObject.FileTransfer(argv[1]);
            Sleep(4000);
        }
    }

3、传输文件的方法实现

void FileTransfer(const char *filename)
{
    char* buf = new char[ALLJOYN_MAX_ARRAY_LEN];
    memset(buf,0,ALLJOYN_MAX_ARRAY_LEN);//官方版本并没有把buf清零,较危险

    long l,length,len;
    ifstream inputStream(filename, ios::in | ios::binary);

    if (inputStream.is_open()) {
        MsgArg args[2];
        QStatus status = ER_OK;
        const uint8_t flags = ALLJOYN_FLAG_GLOBAL_BROADCAST;

        l=inputStream.tellg();
        inputStream.seekg(0,ios::end);
        length=inputStream.tellg();
        len = length;

        //在这里我限定了文件大小,最大为1M
        if (len > 1024 * 1024){
            printf("too big image size\n");
            exit(-1);
        }

        inputStream.seekg(0);

        while (len > 0) {
            //如果图片超过alljoyn规定的数组最大长度,得分块传

            long bufferLength = ALLJOYN_MAX_ARRAY_LEN;

            if (len > (filebuf::pos_type)ALLJOYN_MAX_ARRAY_LEN) {
                len -= (filebuf::pos_type)ALLJOYN_MAX_ARRAY_LEN;
            } else {
                bufferLength = len;
                len = 0;
            }

            inputStream.read(buf, bufferLength);

            args[0].Set("s", filename);
            args[1].Set("ay", bufferLength, buf);

            status = Signal(NULL, s_sessionId, *picDataSigMember, args, 2, 0, flags);
        }
        //最后一次传输标识图片传输结束,方便对方检测
        args[0].Set("s", filename);
        args[1].Set("ay", 0, NULL);

        status = Signal(NULL, s_sessionId, *picDataSigMember, args, 2, 0, flags);
        printf("sent %s ok. size:%d\n",filename,length);
    } else {
        printf("The file doesn't exist or the permissions is stopping the app from opening the file.\n");
    }
}

服务端

1、创建相同的图片信号,并添加信号处理方法

fileTransferInterface->AddSignal("FileTransfer", "say", "name,data", 0, 0);
status =  s_msgBus->RegisterSignalHandler(this,
                static_cast<MessageReceiver::SignalHandler>(&FileTransferObject::FileTransferSignalHandler),
                picDataSigMember,
                NULL);

2、main主线程休眠;信号处理方法实现如下:

void FileTransferSignalHandler(const InterfaceDescription::Member* member,const char* sourcePath,
        Message& msg)
    {
        //这个实现我改得较多,没有分块数,且不用每次都解析文件名
        uint8_t* data;
        size_t size;
        static unsigned int offset = 0;

        msg->GetArg(1)->Get("ay", &size, &data);

        if (size != 0) {
            //pData是动态分配的,大小即是我规定的最大大小
            memcpy(pData+offset,data,size);
            offset += size;
            printf("rece size:%d\n",size);

        } else {
            //图片发完了
            if (outputStream == NULL) {
                printf("The file received ok\n");

                char* filePathAndName;

                msg->GetArg(0)->Get("s", &filePathAndName);

                //解析文件名
                char *fileName = filePathAndName;
                char* fileNameBack = strrchr(filePathAndName, '\\');
                char* fileNameForward = strrchr(filePathAndName, '/');
                if (fileNameBack && fileNameForward) {
                    fileName = (fileNameBack > fileNameForward ? fileNameBack : fileNameForward) + 1;
                } else {
                    if (fileNameForward) {
                        fileName = fileNameForward + 1;
                    }
                    if (fileNameBack) {
                        fileName = fileNameBack + 1;
                    }
                }
                printf("opening the output stream to write file '%s'.\n", fileName);
                outputStream = new ofstream(fileName, ios::out | ios::binary);

                //字节流写入文件
                outputStream->write(pData,offset);
                offset = 0;//务必清零
            }
            delete outputStream;
            outputStream = NULL;
        }
    }

如此一来,分别启动,就能传输了。效果截图:

当然还可以做进一步的优化,比如做成界面或者一对多传输、多对多传输形式等等

时间: 2024-11-07 16:35:37

【AllJoyn框架-09】AllJoyn 局域网文件传输(修改官方版本)的相关文章

c# 局域网文件传输实例

一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Text;using System.Threading;using System.Threading.Task

局域网文件传输

ClientFile.java /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ package com.tcp.file; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.S

开源项目 AllJoyn 框架

AllJoyn框架概述 AllJoyn实现的是一个"分布式软件总线" 总线为点对点模式 协议不依赖于网络 这三点是从介绍的PPT中翻过来的,但理解简单理解一下看以认为,这个框架是分布式的一个中间层通信框架,主要是支持点对点通信,并且由中间层屏蔽了底层物理网络的差异,对上层高级编程语言直接提供接口. 高层系统框架 此图摘自(AllJoyn - Tech Overview v3_for Brooks) 从高层的这个框架中可以看出系统中只有两种节点: Routing Nodes (RN) L

VirtualBox虚拟机与物理机文件传输九大方法总结

对于用虚拟机安装完成操作系统后,我们很多时候会用到虚拟机与物理机直接进行文件传输的问题,对于这个问题,奶牛觉得方法很多,而且也很简单.在这里做下简要介绍,也希望有其它方法的朋友也留言一起交流.今天主要讨论VirtualBox的一些独有或特有的方法. 1.VirtualBox分配数据空间功能 安装完成VirtualBox的虚拟机后,我们首先要做的应该是把扩展工具装齐,可以参考奶牛的文章 VirtualBox虚拟机下安装Windows系统配置远程桌面教程 .安装完成扩展工具后我们可以很简单的使用Vi

企业网盘居然支持高速局域网文件传输工具(速度可达20M)

高速局域网文件传输工具Mobox,局域网内文件共享是公司内非常必须的功能,原本文件共享可以通过:1)windows目录共享目录来实现文件交互:2)通过U盘拷贝给对方:3)通过QQ发送给对方:4)通过邮件发送给对方: 高速局域网文件传输工具Mobox工作方式介绍: 1.局域网文件传输的实现 1)局域网文件传输工具启动的方式 l 通过资源管理器右键l 通过Mobox网盘 l? 通过AM8 即时通 2)局域网文件传输工具人员选择l? 通过组织机构获取接受人员l? 通过历史记录获取接收人员l? 通过手工

networkcomms通信框架实现大文件传输

networkcomms2.3.1通信框架实现大文件传输(为节省空间,不包含通信框架源码,通信框架源码请另行下载) 文件传送在TCP通信中是经常用到的,本文针对文件传送进行探讨 经过测试,可以发送比较大的文件,比如1个G或者2个G 本文只对文件传送做了简单的探讨,示例程序可能也不是很成熟,希望本文起到抛砖引玉的作用,有兴趣的朋友帮忙补充完善 首先看一下实现的效果 服务器端: 客户端(一次只能发送一个文件): 服务器端收到的文件,存放到了D盘根目录下(存放的路径可以根据情况修改) 本程序基于开源的

Linux socket跨局域网聊天和文件传输

一直想写一个跨局域网聊天和文件传输,以及视频聊天的软件,这两天刚好闲着没啥事就把代码写完了,代码已经上传至github:https://github.com/vinllen/chat 其实之前想法P2P模式,P2P的话必须穿透NAT,现在的NAT有4种模式: 完全圆锥型NAT 受限圆锥型NAT 端口受限圆锥型NAT 对称NAT(双向NAT) 维基百科给出的定义如下: 1.Full cone NAT,亦即著名的一对一(one-to-one)NAT 一旦一个内部地址(iAddr:port1)映射到外

局域网内基于UDP的文件传输小工具

一.目标 基于UDP来设计一个文件传输的小工具,以此来了解UDP协议的特点. 内容: 基本要求: 输入对方IP地址,对方如果存在,可以给对方发送文件. 扩展要求: (1)工具具有友好的用户界面: (2)局域网内使用该工具的两台主机可以互相进行文字通信: (3)自动按照一定频率扫描局域网内其他开启了该工具的主机,并在界面上用列表显示出来: (4)传输文件和文字内容时,直接选择界面上已经显示出来的存活主机,不需要手动输入IP地址. 二.设计实现 环境: Ubuntu14.04+Gcc4.8+Ecli

详解“FTP文件传输服务”安装配置实例

"FTP文件传输服务"安装配置实例 家住海边喜欢浪:zhang789.blog.51cto.com 目录 简介 ftp工作原理 常见的FTP服务 Vsftpd服务器的安装 Vsftpd.conf配置文件详解 配置FTP服务器实例 实例:配置匿名用户 实例:配置本地用户登录 实例:配置虚拟用户登录(MySQL认证) 实例:控制用户登录 实例:设置欢迎信息 分析vsftpd日志管理 FTP服务器配置与管理 简介 FTP 是File Transfer Protocol(文件传输协议)的英文简