首页 文章

Javascript Node.js和Socket.IO广播服务器

提问于
浏览
4

我只需要一个简单的例子来说明如何做一个我将解释的Node.JS服务器 .

基本上Node.JS将运行2个服务器: - 原始TCP服务器和 - Socket.IO服务器目标是将数据从TCP客户端转发给对其感兴趣的各种Socket.IO客户端

这样做的原因是为了方便与其他语言进行通信(我将有一个java服务器在tcp套接字中发送消息,因为我找不到更好的方法来做到这一点 - 所有可用的java库(socket.io)由于几乎每种语言都有socket api,因此java中实现的服务器和客户端都是错误的 .

TCP客户端将在连接后立即发送一个字符串,Node.JS服务器将使用它创建一个命名空间并为其提供数据,以便Socket.IO客户端必须能够接收服务器将从TCP客户端转发的数据 .

脚步:

  • 侦听TCP连接

  • 在新的TCP连接上从客户端接收字符串

  • 使用名为tcp client提供的字符串的命名空间创建一个Socket.IO服务器

  • 开始从TCP客户端接收数据并将其广播到所有连接到此套接字打开时创建的命名空间的Socket.IO客户端

这必须以各种TCP客户端和Socket.IO客户端可以通信的方式进行

我无法找到如何以有效的方式做到这一点,如果有人可以提供一个简单的例子我肯定它会帮助很多ppl(因为Node.JS和Socket.IO缺乏文档),这很容易为ppl做已经知道这个问题的人 .

谢谢 .


更新:

我做到了:

node.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通过TCP套接字连接没有nodejs然后发送命名空间名称,nodejs创建一个带有该命名空间的socket.io服务器,并转发java套接字发送给连接到该命名空间的所有socket.io客户端的所有消息

如果有人看到可能出现的错误或改进,请分享 .

谢谢

1 回答

  • 0

    我正在制作一个类似的应用程序,但不是使用TCP,而是在TCP上使用ZeroMQ . 这段代码非常简单 .

    在这里查看我的代码: https://github.com/EhevuTov/netPeek

    做:

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

    我希望有所帮助 .

    作为旁注,我认为我的回调函数没有正确实现 . 我想我每次传递消息时都会设置on事件对象 . 如果您找到更好的方法,请提交拉取请求并修复 . :-)

相关问题