如何使用快递发布请求发射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是不是我喜欢:(。