Node.js 的 WebSocket 模块 ws.io

码农软件 · 软件分类 · Node.js 扩展 · 2019-04-15 15:13:19

软件介绍

A simple wrap to node.js ws module and then we can use it in a manner  like socket.io. It's really easy to use socket.io but it doesn't  support Blob yet. So I write a simple wrap to ws module for this  purpose. This is also a part of works from a contest by  ithelp.ithome.com.tw.

Features:

  1. trnasfer Blob/ArrayBuffer by put it in an object and emit it just as socket.io

  2. broadcast to all but not me

  3. emit to specified peer by socket.to(socket.id).emit('event', data)

  4. join/leave/in room

  5. in-memory store

Limits:

  1. can only send one Blob/ArrayBuffer within one emit

  2. the Blob/ArrayBuffer object must be a property of the emitting object in the first level, no deeper

  3. no configuration support

  4. no 3rd party data store support

  5. cannot scale (due to current sockets management and store design)

  6. client support is now through a static url: /ws.io/ws.io.js

install

npm install ws.io

usage

a simple echo server. (echo.js)

var app = require('http').createServer(handler),
io = require('./ws.io').listen(app);
app.listen(8443);

function handler (req, res) {
    res.setHeader('Content-Type', 'text/html');
    res.writeHead(200);
    res.end(
        "<!DOCTYPE html>"+
        "<html>"+
        "<head>"+
        "<script src='/ws.io/ws.io.js'></script>"+
        "<script>"+
        "var socket = io.connect('ws://localhost:8443');"+
        "socket.on('echo', function(data) {"+
        "    alert(data);"+
        "});"+
        "</script>"+
        "<body>"+
        "<button id='echo'>echo</button>"+
        "</body>"+
        "</html>"+
        "<script>"+
        "var button = document.getElementById('echo');"+
        "button.onclick = function() {"+
        "    socket.emit('echo', 'hello echo server.');"+
        "}"+
        "</script>"
    );
}

io.sockets.on('connection', function (socket) {
    socket.on('echo', function(data) {
        socket.emit('echo', data);
    });
});

a simple blob sharing through file api. (blob.js)

var fs = require('fs'),
url = require('url'),
app = require('http').createServer(function(req, res) {
    res.setHeader('Content-Type', 'text/html');
    res.writeHead(200);
    res.end(
        "<!DOCTYPE html>"+
        "<html>"+
        "<meta charset='utf-8'>"+
        "<head>"+
        "<style>"+
        "#panel {"+
        "    border: solid 1px #336699;"+
        "    line-height: 20px;"+
        "    vertical-align: middle;"+
        "    padding: 5px;"+
        "    border-radius: 5px;"+
        "}"+
        "</style>"+
        "<script src='/ws.io/ws.io.js'></script>"+
        "</head>"+
        "<body>"+
        "<input type='file' id='files'><br>"+
        "<div id='panel'><ul id='list'></ul></div>"+
        "</body>"+
        "</html>"+
        "<script>"+
        "var files = document.getElementById('files');"+
        "var socket = io.connect('ws://localhost:8443');"+
        "function getUrl() {"+
        "    if(!!window.URL) {"+
        "        return window.URL;"+
        "    }"+
        "    if(!!window.webkitURL) {"+
        "        return window.webkitURL;"+
        "    }"+
        "}"+
        ""+
        "files.addEventListener('change', function(e) {"+
        "    var URL = getUrl();"+
        "    if(files.files.length>0) {"+
        "        var file = files.files[0];"+
        "        if(file.type==='') {"+
        "            alert('File type unknown. Process stopped.');"+
        "            return false;"+
        "        }"+
        "        var src = URL.createObjectURL(file);"+
        "        var a = document.createElement('a');"+
        "        a.href = src;"+
        "        a.innerHTML = file.name;"+
        "        a.target = '_blank';"+
        "        var li = document.createElement('li');"+
        "        li.appendChild(a);"+
        "        document.getElementById('list').appendChild(li);"+
        "        socket.emit('share', {filename: file.name, type: file.type, file:file});"+
        "    }"+
        "});"+
        "var fileinfo;"+
        "socket.on('share', function(data) {"+
        "    var URL = getUrl();"+
        "    var a = document.createElement('a');"+
        "    var file = new Blob([data.file], {type:data.type});"+
        "    a.href = URL.createObjectURL(file);"+
        "    a.innerHTML = data.filename;"+
        "    a.target = '_blank';"+
        "    var li = document.createElement('li');"+
        "    li.appendChild(a);"+
        "    document.getElementById('list').appendChild(li);"+
        "});"+
        "</script>"
    );
}),
io = require('ws.io').listen(app);

io.sockets.on('connection', function(socket) {
    socket.on('share', function(data) {
        socket.broadcast.emit('share', data);
    });
});

app.listen(8443);

本文地址:https://www.codercto.com/soft/d/3641.html

程序员之禅

程序员之禅

[德] Christian Grobmeier / 荣耀、朱艳 / 人民邮电出版社 / 2015-8 / 39.00元

禅是一种生活态度和生活方式。程序员是一份特别辛苦的职业,也是一个承受各种压力的群体。在物欲横流的今天,禅对于程序员有着特殊的意义和价值。 本书的作者是一名德国程序员老兵,深谙程序员的喜怒哀乐。他曾经发表了一篇题为“程序员之禅的十条法则”的博客文章,引发众多程序员热烈的讨论和强烈的共鸣。本书共10章,结合程序员日常生活和工作的方方面面,作者通过对禅的知识、理解、体验、思考和感悟,提出很多中肯的......一起来看看 《程序员之禅》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具