V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
edwardwo
V2EX  ›  分享创造

个人业余时间做的 P2P 文件传输 library

  •  
  •   edwardwo · 2017-08-17 11:26:01 +08:00 · 3804 次点击
    这是一个创建于 2684 天前的主题,其中的信息可能已经有所发展或是发生改变。

    入口:

    https://github.com/edwardwohaijun/simple-filer

    技术要求:

    • 客户端暂时只支持 Chrome 浏览器
    • 服务端需要支持 wesocket 的 webServer 即可

    安装:

    npm install simple-filer
    

    使用:

    客户端:

    var ws = new WebSocket('wss://127.0.0.1:8443');
    var Filer = require('simple-filer')
    var filer = new Filer({myID: 123, signalingChannel: ws})
    
    ws.onmessage = msg => {
      var msgObj = JSON.parse(msg.data);
      switch (msgObj.msgType) {
        case "signaling":
          filer.handleSignaling(msgObj);
          break;
      }
    };
    
    filer.on('task', function(task) { // when you are about to send/receive a file, newTask event is fired
      console.log('new task: ', task); // this is where you can add task info on the webpage
    });
    
    filer.on('progress', function({fileID, progress, fileName, fileURL}){ // file transfer progress event
      console.log('file transfer progress: ', fileName, ': ', progress)
    });
    
    filer.on('status', function({fileID, status}){ // file transfer status: pending/sending/receiving/done/removed
      console.log('new status for ', fileID, ': ', status)
    });
    

    初始化完 filer object 后, 定义一些 event handlers, 然后当 websocket 收到 message 后, 如果是"signaling"的类型, 则丢给 filer.handleSignaling(msgObj)去执行即可.

    服务端:

    wss.on('connection', function(ws){
      ws.on('message', msg => {
        var msgObj = JSON.parse(msg);
        switch (msgObj.msgType) {
          case "signaling":
            var targetClient = users[msgObj.to];
            targetClient.send(msg) // forward the signaling data to the specified user
            break;
          default: console.log('Oops. unknown msg: ', msgObj)
        }
      });
    })
    

    WebSocket 读取客户端发来的 message, 解析后, 如果 msgType 是"signaling", 则: 转发给"msgObj.to"中指定的接受方.

    Example app

    通过 npm 安装后, 目录中附带了一个完整的例子, 只需:

    cd node_modules/simple-filer/example
    npm install
    npm run start
    

    打开 Chrome 浏览器的 2 个窗口, 进入 httpS://127.0.0.1:8443 即可实现双方互传文件. 这里有个动态截图显示运行时的界面. running demo of example app

    如果想在本地局域网中运行, 则编辑 example/public/javascripts/bundle.js 文件, 查找 var ws = new WebSocket, 修改为你的本机 IP, 再 restart app 即可. 要想在你自己的 web 项目中嵌入该 library, 则可以参考 example/public/javascripts/src/demo.js 文件(总共就 150 行).

    遇到问题怎么办

    你可以直接在 github 上提 issue, 也可以在本人的chat web app上发言(无需注册), 我已经为该 simple-filer 项目建立了一个讨论组.

    7 条回复    2017-08-17 14:53:03 +08:00
    Famio
        1
    Famio  
       2017-08-17 11:46:33 +08:00
    6666,支持大神
    m2276699
        2
    m2276699  
       2017-08-17 11:52:15 +08:00
    nat3 可以不?
    edwardwo
        3
    edwardwo  
    OP
       2017-08-17 12:20:06 +08:00
    @m2276699 P2P 连接, 其底层是通过 WebRTC 实现的, 而 WebRTC 又需要借助 stun server 才能穿越防火墙 /NAT. 对于某些 NAT, 如 symmetric NAT 是肯定无法穿越的, NAT3 能否穿越, 我也不清楚. 一般在商业领域, 遇到无法穿越防火墙的情况, 会再提供一台 TURN server 用来做数据中转, 因此 new Filer 的 constructor 还有个第三 optional 参数, webrtcConfig
    这个参数就可以用来指定 TURN server, 如:

    configObject = {iceServers: [{url: 'stun:stun.l.google.com:19302'}, {url: 'turn:SERVERIP:PORT', credential: 'secret', username: 'username'}, ...]}
    var filer = new Filer({myID: 123, signalingChannel: ws, webrtcConfig: configObject})
    m2276699
        4
    m2276699  
       2017-08-17 14:30:24 +08:00
    @edwardwo 哈哈,我还心存遇到黑科技的希望。。。其实这类网络注定是只能转发。什么 N2N 之类的遇到移动宽带只能哭
    kmahyyg
        5
    kmahyyg  
       2017-08-17 14:39:16 +08:00 via Android
    那个聊天的开源不?
    tianwm
        6
    tianwm  
       2017-08-17 14:40:00 +08:00 via iPhone
    马克一下
    edwardwo
        7
    edwardwo  
    OP
       2017-08-17 14:53:03 +08:00
    @kmahyyg 聊天的 web app, 暂时不准备开源, bug 太多. 这个聊天 app 其实没啥技术含量, 都是现成的技术, 拿来整合在一起罢了.
    @m2276699 穿越防火墙 /NAT 的原理很简单, 没啥折腾的空间, 诞生不了黑科技.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:29 · PVG 23:29 · LAX 07:29 · JFK 10:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.