Узел Javascript.js и Socket.IO широковещательный сервер



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



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



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



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



Шаги:





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



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


  • Создать сокет.IO сервер с пространства имен строке указана от TCP клиента



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



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



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



Спасибо.





Обновление:



Я сделал это:



Узел.код 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 + 'rn');
}

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 no nodejs over TCP socket then send a namespace name, nodejs create a socket.io сервер с этим пространством имен и переслать все сообщения java socket отправляет всем socket.io клиенты, подключенные к этому пространству имен



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



Спасибо

677   1  

1 ответ:

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

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

Do:

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

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

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

Comments

    Ничего не найдено.