Javascript Node.js和Socket.IO广播服务器
我只需要一个简单的例子来说明如何使用Node.JS服务器 Node.JS基本上有两台服务器在运行: -一个粗糙的TCP服务器和 -Socket.IO服务器 目标是将数据从TCP客户端转发到感兴趣的各种Socket.IO客户端 这样做的原因是为了简化与其他语言的通信(我将让一个java服务器在tcp套接字中发送消息,因为我找不到更好的方法来这样做——所有可用的java库(socket.io服务器和用java实现的客户机)都有bug),因为几乎每种语言都有socket api TCP客户端将在connect之后立即发送一个字符串,Node.JS服务器将使用该字符串创建一个名称空间并为其提供数据,因此Socket.IO客户端必须能够接收服务器将从TCP客户端转发的数据 步骤:Javascript Node.js和Socket.IO广播服务器,javascript,node.js,tcp,socket.io,broadcast,Javascript,Node.js,Tcp,Socket.io,Broadcast,我只需要一个简单的例子来说明如何使用Node.JS服务器 Node.JS基本上有两台服务器在运行: -一个粗糙的TCP服务器和 -Socket.IO服务器 目标是将数据从TCP客户端转发到感兴趣的各种Socket.IO客户端 这样做的原因是为了简化与其他语言的通信(我将让一个java服务器在tcp套接字中发送消息,因为我找不到更好的方法来这样做——所有可用的java库(socket.io服务器和用java实现的客户机)都有bug),因为几乎每种语言都有socket api TCP客户端将在con
- 侦听TCP连接
- 在新TCP连接上,从客户端接收字符串
- 使用tcp客户端提供的名为字符串的命名空间创建Socket.IO服务器
- 开始从TCP客户端接收数据,并将其广播到连接到此套接字打开时创建的命名空间的所有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>
变量套接字=io.connect(“http://localhost/testnamespace“,{端口:8081});
console.log(io.version);
socket.on('connect',function(){
console.log('Connected');
});
socket.on('m',函数(msg){
console.log('收到的消息:'+msg);
});
socket.on('disconnect',function(){
console.log('Disconnected');
});
工作原理:
Java connect no nodejs over TCP socket然后发送名称空间名称,nodejs使用该名称空间创建socket.io服务器,并将Java socket发送的所有消息转发给连接到该名称空间的所有socket.io客户端
如果有人看到可以做出的错误或改进,请分享
谢谢我正在制作一个类似的应用程序,但是我没有使用TCP,而是在TCP之上使用ZeroMQ。这段代码非常简单 在这里查看我的代码: https://github.com/EhevuTov/netPeek 做: 我希望这有帮助
顺便说一句,我认为我的回调函数没有正确实现。我想我是在每次传递消息时设置on事件对象。如果找到更好的方法,请提交带修复程序的拉取请求。:-) 感谢您的分享,我发现您的ZeroMQ解决方案对于我来说也是一个非常好的主意,但是我离截止日期很近,所以我不得不采用更简单(但不是最好)的方式。将来,我肯定会用类似于您的项目的东西深入探讨这个问题。=)
$:node support/msu_gen.js
$:node app.js