Javascript Node.js и Socket.IO вещательный сервер - PullRequest
4 голосов
/ 23 ноября 2011

Мне просто нужен простой пример, как сделать сервер Node.JS, который я объясню.

В основном Node.JS будет иметь 2 запущенных сервера: - сырой TCP-сервер и - Socket.IOСервер Цель состоит в том, чтобы пересылать данные из TCP-клиента различным заинтересованным в нем клиентам Socket.IO

. Причина, по которой это делается, - упростить общение с другими языками (у меня будет Java-сервер.отправка сообщений в tcp-сокет, так как я не смог найти лучшего способа сделать это - все доступные библиотеки java (сервер socket.io и клиенты, реализованные в java) глючат), так как почти каждый язык имеет сокет api.

TCP-клиент отправит строку сразу после подключения, и сервер Node.JS создаст с ним пространство имен и предоставит для него данные, поэтому клиенты Socket.IO должны иметь возможность получать данные, которые сервер будет пересылать с TCP-клиента.

Шаги:

  • Прослушивать TCP-соединения

  • При новом TCP-соединении получить строку frом клиент

  • Создайте сервер Socket.IO с пространством имен с именем строки, предоставленной от клиента tcp

  • Начните получать данные от клиента TCP ишироковещательная рассылка всем клиентам Socket.IO, подключенным к пространству имен, которое было создано при открытии этого сокета

Это должно быть сделано так, чтобы различные клиенты TCP и клиенты Socket.IO моглиобщаться

Я не могу найти, как сделать это эффективно, если кто-то может привести простой пример, я уверен, что это поможет многим людям (поскольку Node.JS и Socket.IO не хватает документации) иэто легко сделать для людей, которые уже знают о предмете.

Спасибо.


ОБНОВЛЕНИЕ:

Я сделал это:

узел.js код:

var javaPort = 8080;
var sIOPort = 8081;
var javaServer = require('net').createServer();
var browserServer = require('socket.io').listen(sIOPort);

console.log('Socket.IO version: ' + require('socket.io').version);

javaServer.on('listening', function () {
    console.log('Server is listening on ' + javaPort);
});

javaServer.on('error', function (e) {
    console.log('Server error: ' + e.code);
});

javaServer.on('close', function () {
    console.log('Server closed');
});

javaServer.on('connection', function (javaSocket) {
    var clientAddress = javaSocket.address().address + ':' + javaSocket.address().port;
    console.log('Java ' + clientAddress + ' connected');

    var firstDataListenner = function (data) {
        console.log('Received namespace from java: ' + data);
        javaSocket.removeListener('data', firstDataListenner);
        createNamespace(data, javaSocket);
    }

    javaSocket.on('data', firstDataListenner);

    javaSocket.on('close', function() {
        console.log('Java ' + clientAddress + ' disconnected');
    });
});

javaServer.listen(javaPort);

function createNamespace(namespaceName, javaSocket) {
    var browserConnectionListenner = function (browserSocket) {
        console.log('Browser Connected');
        var javaSocketDataListenner = function(data) {
            console.log('Data received from java socket and sent to browser: ' + data);
            browserSocket.emit('m', data + '\r\n');
        }

        var javaSocketClosedListenner = function() {
            console.log('The java socket that was providing data has been closed, removing namespace'); 
            browserSocket.disconnect();
            browserServer.of('/' + namespaceName).removeListener('connection', browserConnectionListenner);
            javaSocket.removeListener('data', javaSocketDataListenner);
            javaSocket.removeListener('close', javaSocketClosedListenner);
        }

        javaSocket.on('close', javaSocketClosedListenner);
        javaSocket.on('data', javaSocketDataListenner);

        browserSocket.on('disconnect', function () {
            console.log('Browser Disconnected');
            javaSocket.removeListener('data', javaSocketDataListenner);
            javaSocket.removeListener('close', javaSocketClosedListenner);
        });
    }

    var namespace = browserServer.of('/' + namespaceName).on('connection', browserConnectionListenner);
}

java код:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        try {
            Socket nodejs = new Socket("localhost", 8080);
            sendMessage(nodejs, "testnamespace");
            Thread.sleep(100);
            int x = 0;
            while (true)
            {
                sendMessage(nodejs, x + "");
                x++;
                Thread.sleep(1000);
                System.out.println(x + " has been sent to server");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void sendMessage(Socket s, String message) throws IOException {
        s.getOutputStream().write(message.getBytes("UTF-8"));
        s.getOutputStream().flush();
    }

    public static String readMessage(Socket s) throws IOException {
        InputStream is = s.getInputStream();
        int curr = -1;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while ((curr = is.read()) != -1) {
            if (curr == '\n') {
                break;
            }
            baos.write(curr);
        }
        return baos.toString("UTF-8");
    }
}

html код:

<html>
    <head>
    <script src="socket.io.js"></script>
    </head>
    <body>
    <script>
        var socket = io.connect("http://localhost/testnamespace", {port: 8081});
        console.log(io.version);
        socket.on('connect', function () {
            console.log('Connected');
            });
        socket.on('m', function (msg) {
            console.log('Message received: ' + msg);
        });
        socket.on('disconnect', function () {
            console.log('Disconnected');
        });
    </script>
    </body>
</html>

Как это работает:

Java connect nonodejs через TCP-сокет затем отправляет имя пространства имен, nodejs создает сервер socket.io с этим пространством имен и пересылает всесообщения java socket отправляет всем клиентам socket.io, подключенным к этому пространству имен

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

Спасибо

1 Ответ

0 голосов
/ 23 ноября 2011

Я делаю подобное приложение, но вместо TCP я использую ZeroMQ поверх TCP. Этот код работает очень просто.

Проверьте мой код здесь: https://github.com/EhevuTov/netPeek

Do:

$:node support/msu_gen.js
$:node app.js

Надеюсь, это поможет.

Как примечание, я не думаю, что моя функция обратного вызова реализована должным образом. Я думаю, что я устанавливаю объект события каждый раз, когда сообщение передается. Если вы найдете лучший способ, отправьте запрос на исправление. : -)

...