Как использовать экспресс-почтовый запрос для отправки Socket.io или Sockjs? - PullRequest
6 голосов
/ 23 февраля 2012

Я знаю, что этот вопрос довольно неловкий, но проблема возникает из-за Samsung TV 2010/2011 SmartTV (и проигрывателя blue ray; конечно, эмулятор 2012 года работает нормально). Я перенес простые примеры из чата, полученные из источника и пакета, в приложение SmartTV. Оба они возвращаются к опросу JSONP, но из приложения SmartTV может отправлять / отправлять на сервер только один раз. Получение сообщения с сервера может происходить несколько раз без каких-либо проблем. После поиска ответа на форуме Samsung D (разумеется, там ничего нет), я думаю, что самый быстрый способ обойти эту проблему - это развернуть сервер Express, взяв почтовые данные и JSON.parse, а затем выпустив Socket.io / Sockjs изнутри внутри самого сервера.

Может кто-нибудь показать мне простой пример кода, чтобы я мог начать с него? Большое спасибо.

Я быстро создаю код, но, похоже, он не работает:

Библиотека / 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>

«Мое другое событие», кажется, ничего не получает.

Ответы [ 4 ]

12 голосов
/ 23 февраля 2012

ОБНОВЛЕНИЕ: Я обновил пример для вас, чтобы сделать его более полным. У меня не было 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/ и нажмите кнопку. Проверьте вашу консоль на вывод.

2 голосов
/ 23 февраля 2012

На основании примера SockJS express server.js может выглядеть так:

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

// 1. Echo sockjs server
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);
    connections[conn.id] = conn
    conn.on('close', function() {
        delete connections[conn.id];
    });

    // Echo.
    conn.on('data', function(message) {
        conn.write(message);
    });
});

// 2. Express server
var app = express.createServer();
sockjs_echo.installHandlers(app, {prefix:'/echo'});

console.log(' [*] Listening on 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", function(req, res, next) {
    for(var id in connections) {
        connections[id].write('received POST');
    }
    res.send({});
});

Для тестирования откройте браузер на локальном хосте: 9999 и запустите:

curl localhost:9999/send -X POST
1 голос
/ 21 июня 2019

просто удалите этот комментарий //socket.emit('news ', {hello:' world '});to socket.emit ('news', {hello: 'world'});

он будет работать, потому что он передает данные через новости, и вы слушаете, используя мое другое событие вместо 'news', или вы можете сделатьпросто слушайте, используя «мое другое событие»

0 голосов
/ 24 апреля 2012

Не знаю, поможет ли это, но вы можете создать абстракцию 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 и использование их patch .

Если у кого-то есть лучшее решение для Socket.IO это будет оценено, потому что я уже глубоко в проекте и уже слишком поздно переключать Socket.IO на Sockjs, и это решение мне не нравится :(.

...