【问题标题】:Javascript Node.js and Socket.IO broadcast serverJavascript Node.js 和 Socket.IO 广播服务器
【发布时间】:2012-01-04 08:59:14
【问题描述】:

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

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

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

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

步骤:

  • 监听 TCP 连接

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

  • 使用命名空间创建 Socket.IO 服务器,命名空间为 tcp 客户端提供的字符串

  • 开始从 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 + '\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 套接字连接 no nodejs 然后发送一个命名空间名称,nodejs 使用该命名空间创建一个 socket.io 服务器并将 java 套接字发送的所有消息转发到连接到该命名空间的所有 socket.io 客户端

如果有人看到可以做出的错误或改进,请分享。

谢谢

【问题讨论】:

    标签: javascript node.js tcp socket.io broadcast


    【解决方案1】:

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

    在此处查看我的代码: https://github.com/EhevuTov/netPeek

    做:

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

    希望对你有帮助。

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

    【讨论】:

    • 感谢分享,我发现您使用 ZeroMQ 的解决方案对我的目的来说也是一个非常好的主意,但我真的快到最后期限了,所以我不得不采用更简单(而不是最好)的方法。将来,我肯定会通过与您的项目类似的东西来深入探讨这一点。 =)
    猜你喜欢
    • 2012-01-25
    • 2016-11-08
    • 1970-01-01
    • 2022-01-27
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多