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

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

基本上Node.JS将运行2台服务器: - 一个粗略的TCP服务器和 - 一个Socket.IO服务器目标是将数据从一个TCP客户端转发到对它感兴趣的各种Socket.IO客户端

这样做的原因是使与其他语言的通信变得容易(我将有一个java服务器在tcp套接字中发送消息,因为我找不到更好的方法来做到这一点 - 所有可用的java库(socket.io服务器和用java实现的客户端)都是bug,因为几乎每种语言都有套接字API。

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

脚步:

  • 监听TCP连接

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

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

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

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

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

    谢谢。


    更新:

    我做到了:

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

    如果有人发现可能出现的错误或改进,请分享。

    谢谢


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

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

    做:

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

    我希望有所帮助。

    作为一个方面说明,我不认为我的回调函数执行得当。 我想我每次消息传递时都设置on事件对象。 如果您找到更好的方法,请提交修复请求。 :-)

    链接地址: http://www.djcxy.com/p/94587.html

    上一篇: Javascript Node.js and Socket.IO broadcast server

    下一篇: libclang getting original struct parameter types