如何使用快递发布请求发射Socket.io或Sockjs?

我知道这个问题是有点尴尬,但问题来自三星电视2010/2011年智能电视(和蓝光播放器;当然2012年模拟器工作正常)。 我将简单的聊天示例从源代码和包装中移植到SmartTV应用程序中。 他们都回落到JSONP轮询,但从SmartTV应用程序只能发射/推到服务器一次。 从服务器接收消息可以多次没有任何问题。 在三星D论坛(当然没有什么)寻找答案后,我认为解决这个问题的最快方法是部署一个Express服务器,取出后数据和JSON.parse,然后在内部发送Socket.io / Sockjs在服务器本身内部。

有人可以给我看一个简单的示例代码,所以我可以从那里开始? 非常感谢。

我很快做代码,但似乎不起作用:

LIB / server.js

var express = require('express') , app = express.createServer() , io = require('socket.io').listen(app); app.listen(80); app.use(express.bodyParser()); app.get('/', function (req, res) { res.sendfile('/var/www/mpgs_lite_v3/index.html'); }); app.post('/', function(req, res){ console.log(req.body); io.sockets.emit('my other event', req.body); res.redirect('back'); }); io.sockets.on('connection', function (socket) { //socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); }); 

的index.html

 <html> <head> <script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script> </head> <body> <form method="post" action="/"> <input type="hidden" name="_method" value="put" /> <input type="text" name="user[name]" /> <input type="text" name="user[email]" /> <input type="submit" value="Submit" /> </form> </body> </html> 

“我的其他事件”似乎没有收到任何东西。

更新:我更新了你的例子,使其更完整。 我之前没有app.listen ,这里也是一个客户端脚本,它表明它确实工作正常:

 <!doctype html> <html> <head> <script src="//www.google.com/jsapi"></script> <script src="/socket.io/socket.io.js"></script> <script>google.load("jquery", "1.7.1")</script> <script> var socket = io.connect("localhost", {port: 3000}); socket.on("foo", function(message) { console.log("foo: ", message) }); $(function() { $("button").click(function() { $.post("/foo", { message: $("input").val() }); }); }); </script> </head> <body> <input type=text>A message</input> <button>Click me!</button> </body> </html> 

和服务器,现在有一个app.listen指令:

 var express = require("express"), app = express.createServer(), io = require("socket.io").listen(app) index = require("fs").readFileSync(__dirname + "/index.html", "utf8"); app.use(express.bodyParser()); app.get("/", function(req, res, next) { res.send(index); }); app.post("/foo", function(req, res, next) { io.sockets.emit("foo", req.body); res.send({}); }); app.listen(3000); 

用法:

 node app.js 

导航到http://localhost:3000/并单击button。 检查您的控制台输出。

基于SockJS快速示例 server.js可能看起来像:

 var express = require('express');
 var sockjs = require('sockjs');

 // 1. Echo sockjs服务器
 var sockjs_opts = {sockjs_url:“http://cdn.sockjs.org/sockjs-0.2.min.js”};

 var sockjs_echo = sockjs.createServer(sockjs_opts);
 connections = {};
 sockjs_echo.on('connection',function(conn){
    的console.log(conn.id);
    连接[conn.id] = conn
     conn.on('close',function(){
        删除连接[conn.id];
     });

     //回声
     conn.on('data',函数(message){
         conn.write(消息);
     });
 });

 // 2.快递服务器
 var app = express.createServer();
 sockjs_echo.installHandlers(app,{prefix:'/ echo'});

 console.log('[*]聆听0.0.0.0:9999');
 app.listen(9999,'0.0.0.0');

 app.get('/',function(req,res){
     res.sendfile(__ dirname +'/index.html');
 });

 app.post(“/ send”,函数(req,res,next){
     for(var id in connections){
        连接[id] .write('received POST');
     }
     res.send({});
 });

要在本地主机上testing打开的浏览器:9999并运行:

 curl localhost:9999/send -X POST 

我不知道这是否会有所帮助,但是您可以基于您的浏览器在客户端上进行抽象抽象,然后在服务器上使用与socket.oncallback相同的方式来分别处理请求。 为了知道在哪里发送信息,我build议你使用一些可以存储在服务器的散列​​表和客户端的本地存储器中的密钥。

对于客户:

 var emit = function(event, options) { if ("WebSocket" in window) { socket.emit(event, options); console.log("emited via WebSocket"); } else { $.post("http://localhost/emit/" + event, options); console.log("emited via AJAX"); } } emit("echo", { key: localStorage.getItem("key"), data: { hello: "world" } }); socket.on("response", function(data) { console.log(data.hello); //will print "world" }); 

对于服务器:

 var sockets = {}; var echo_handler = function(a) { var socket = sockets[a.key]; var data = a.data; socket.emit("response", data); } app.post("/emit/:event", function(req, res) { var event = req.params.event; switch (event) { case "echo": var a = { key: req.param("key"), data: req.param("data") } echo_handler(a); break; } }); io.sockets.on("connection", function(socket) { socket.on("connect", function(data) { sockets[data.key] = socket; }); socket.on("echo", echo_handler); }); 

另一种方法是切换到Sockjs并使用他们的补丁 。

如果有人有更好的解决scheme的Socket.IO将不胜感激,因为我已经深入到这个项目,为Sockjs切换Socket.IO为时已晚,这种解决scheme是不是我喜欢:(。

Interesting Posts