我知道这个问题有点尴尬,但问题来自三星电视2010/2011智能电视(和蓝光播放器;当然2012模拟器工作正常)。我将源代码和软件包中的简单聊天示例移植到SmartTV应用程序中。它们都回到了JSONP轮询,但从SmartTV应用程序只能向服务器发送/推送一次。从服务器接收消息可能多次都没有任何问题。在Samsung D论坛上寻找答案后(当然没有),我认为解决这个问题的最快方法是部署一个Express服务器,获取post数据和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/
并单击按钮。检查控制台的输出。
基于SockJS的express示例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);连接={};sockjs_echo.on("连接",函数(conn){console.log(conn.id);connections[conn.id]=连接conn.on('close',function(){删除连接[conne.id];});//回声。conn.on("数据",函数(消息){conn.write(消息);});});//2。Express服务器var app=express.createServer();sockjs_echo.installHandlers(应用程序,{prefix:'/echo'});console.log('[*]Listening on 0.0.0.0:9999');app.learn(9999,0.0.0.0);app.get('/',function(req,res){res.sendfile(__dirname+'/index.html');});app.post("/send",函数(req,res,next){for(连接中的var id){connections[id].write('接收POST');}res.send({});});
要在localhost:9999测试打开浏览器并运行:
curl localhost:9999/send -X POST
只需删除此注释//socket.emit('news',{hello:'world'});到socket.emit('news',{hello:'world'});
它会起作用,因为它通过新闻发射数据,而你正在使用我的其他事件而不是"新闻"收听,或者你可以只使用"我的其他活动"收听
我不知道这是否有帮助,但您可以在基于浏览器的客户端上进行一个emit抽象,然后在服务器上进行单独的get函数,该函数将以与socket.on回调相同的方式处理请求。为了知道将信息发送到哪里,我建议您使用一些密钥,这些密钥可以存储在服务器的哈希表和客户端的本地存储中。
对于客户:
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并使用它们的补丁。
如果有人对Socket.IO有更好的解决方案,我们将不胜感激,因为我已经深入到该项目中,现在将Socket.IO切换到Sockjs已经太晚了,而且这个解决方案不符合我的喜好:(.