我只需要一個簡單的例子來說明如何做一個Node.JS服務器,我會解釋一下。Javascript Node.js和Socket.IO廣播服務器
基本上Node.js的將有2臺服務器上運行: - 粗TCP服務器和 - 一個Socket.IO服務器 的目的是從一個TCP客戶端將數據轉發給感興趣
各種Socket.IO客戶這樣做的原因是爲了方便與其他語言進行通信(我將有一個java服務器在tcp套接字中發送消息,因爲我找不到更好的方法來做到這一點 - 所有可用的java庫(套接字.io服務器和用java實現的客戶端)都有bug,因爲幾乎每種語言都有套接字API。
TCP客戶端將在連接後立即發送一個字符串,並且Node.JS服務器將爲其創建一個名稱空間併爲其提供數據,以便Socket.IO客戶端必須能夠接收服務器將從TCP客戶端。
步驟:
監聽TCP連接
在一個新的TCP連接從客戶端
收到一個字符串創建一個名爲字符串命名空間的Socket.IO服務器由tcp客戶端提供
開始從TCP客戶端接收數據並將其廣播到全部ËSocket.IO客戶conected到在此套接字打開
這已經在各種TCP客戶端和Socket.IO客戶端可以通信的方式進行時創建的命名空間
我不能找到如何以有效的方式做到這一點,如果有人可以提供一個簡單的例子,我相信它會幫助很多人(如Node.JS和Socket.IO缺乏文檔),這很容易使人們已經知道的ppl主題。
謝謝。
UPDATE:
我做到了:
的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的連接不上的NodeJS TCP套接字然後發送一個命名空間名稱,創建的NodeJS與命名空間的socket.io服務器轉發所有消息的java插座發送給所有的客戶socket.io連接到該名稱空間
如果任何人看到可能發生的錯誤或改進請分享。
感謝
感謝分享,我發現ZeroMQ的解決方案對我的目的來說也是一個很好的主意,但是我在截止日期前非常接近,所以我不得不做出更簡單(也不是最好)的方式。在未來,我會深入研究與您的項目相似的東西。 =) –