https://github.com/edwardwohaijun/simple-filer
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"中指定的接受方.
通过 npm 安装后, 目录中附带了一个完整的例子, 只需:
cd node_modules/simple-filer/example npm install npm run start
打开 Chrome 浏览器的 2 个窗口, 进入 httpS://127.0.0.1:8443 即可实现双方互传文件. 这里有个动态截图显示运行时的界面.
如果想在本地局域网中运行, 则编辑 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 项目建立了一个讨论组.
![]() | 1 Famio 2017-08-17 11:46:33 +08:00 6666,支持大神 |
2 m2276699 2017-08-17 11:52:15 +08:00 nat3 可以不? |
![]() | 3 edwardwo OP @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}) |
![]() | 5 kmahyyg 2017-08-17 14:39:16 +08:00 via Android 那个聊天的开源不? |
6 tianwm 2017-08-17 14:40:00 +08:00 via iPhone 马克一下 |