2011-11-23 198 views
4

我只需要一個簡單的例子來說明如何做一個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連接到該名稱空間

如果任何人看到可能發生的錯誤或改進請分享。

感謝

回答

0

我正在做一個類似的應用程序,而不是使用TCP我使用ZeroMQ在TCP之上。這段代碼很簡單。

看看我的代碼在這裏: https://github.com/EhevuTov/netPeek

務必:

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

我希望幫助。

作爲一個方面說明,我不認爲我的回調函數執行得當。我想我每次消息傳遞時都設置on事件對象。如果您找到更好的方法,請提交修復請求。 :-)

+0

感謝分享,我發現ZeroMQ的解決方案對我的目的來說也是一個很好的主意,但是我在截止日期前非常接近,所以我不得不做出更簡單(也不是最好)的方式。在未來,我會深入研究與您的項目相似的東西。 =) –