个人业余时间做的 P2P 文件传输 library - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
edwardwo
V2EX    分享创造

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

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

    入口:

    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     Solana     894 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:52 PVG 04:52 LAX 13:52 JFK 16:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86