程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> javascript-[新手]關於socket.io接收tcp服務器數據後轉發給客戶端的問題【一句話就能解決?】

javascript-[新手]關於socket.io接收tcp服務器數據後轉發給客戶端的問題【一句話就能解決?】

編輯:編程解疑
[新手]關於socket.io接收tcp服務器數據後轉發給客戶端的問題【一句話就能解決?】

如標題,接收到了tcp服務器的數據後,想轉發給客戶端。但是socket.io文檔似乎沒有這種方法。直接上代碼。
服務器部分:

**var express=require('express');
var app=express();
var fs =require('fs');
var net=require('net');
var http=require('http').createServer(app);
var io=require('socket.io').listen(http);
//nodeServer需要的變量
var nodeServer = new net.Socket();
var ExBuffer = require('./ExBuffer');
var len = 4027;
var offset=4;
var exBuffer = new ExBuffer().uint32Head().littleEndian();
var sbuf = new Buffer(4);
//存儲客戶端的連接實例
var aSocket={};
app.use(express.static('public'));
app.get('/',function(req,res){
  res.sendfile(__dirname+'/index.html');
});
//連接到C服務器
nodeServer.connect(3102, '127.0.0.1', function() {
  console.log('CONNECTED TO: 127.0.0.1:3102' );
  // 建立連接後立即向服務器發送數據,服務器將收到這些數據
  nodeServer.write('your socket has connected');
});
var server = http.listen(8888, '127.0.0.1',function () {
  var host = server.address().address
  var port = server.address().port
  console.log("welcome to http://%s:%s", host, port)
});
// 同客戶端建立連接
io.sockets.on('connection', function (socketIO) {
  aSocket=socketIO;
  // 從客戶端接收數據,然後發送至Tomcat
  socketIO.emit("test","your websocket has connected");
  socketIO.on('fromWebClient', function (webClientData) {
  });
   //客戶端斷開連接
  socketIO.on('disconnect', function () {
    console.log('DISCONNECTED FROM CLIENT');
  });
});
// 從C服務器接收數據
nodeServer.on('data', function (data) {
  if(data.readUInt8(0)==170){
    sbuf.writeUInt32LE(len,0);//寫入包長
    exBuffer.put(sbuf);
    exBuffer.put(data);
  }
  else{
    exBuffer.put(data);
  }
  console.log('nodeServer'+data.length);
});
//當nodeServer收到完整的數據包時
exBuffer.on('data', function(buffer) {
  console.log('>> nodeServer receive data.length:'+buffer.length);
  //console.log(buffer);
  //console.log(buffer.readInt32LE(826));
   var useData=byteArrayUntil.getUseJson(buffer,offset);
  console.log(aSocket);
  aSocket.emit['pushToWebClient',useData.hz];
});
// 為nodeServer添加“data”事件處理函數
// data是服務器發回的數據
// 為客戶端添加“close”事件處理函數
nodeServer.on('close', function() {
  console.log('Connection closed');
});
//構造一個遍歷函數,分別返回array或者json
var byteArrayUntil=new function(){
  this.getUseData=function(data,offset){
    var arr=[];
    for(var i=0;i<=799;i++){
      arr.push(data.readInt32LE(826+i*offset));
    }
    return arr;
  }
  this.getUseJson=function(data,offset){
    var arr=[];
    for(var i=0;i<=500;i++){
      arr.push(data.readInt32LE(826+i*offset));
    }
    return {'hz':arr};
  }
}();**

客戶端部分:(很多無用的就貼關鍵的了,其實這個可以暫時無視)
<script>
var socket = io.connect();
socket.on("test", function (data) {
    console.log(data);
});
socket.on('pushToWebClient', function (data) {
        console.log(data);

       });
現在問題就是服務器的這一部分:
exBuffer.on('data', function(buffer) {
  console.log('>> nodeServer receive data.length:'+buffer.length);
  //console.log(buffer);
  //console.log(buffer.readInt32LE(826));
   var useData=byteArrayUntil.getUseJson(buffer,offset);
  console.log(aSocket);
  aSocket.emit['pushToWebClient',useData.hz];
});

我把數據接收到了,最後一句轉發給客戶端不會。ps:不用管對應id問題,我只需要簡單實現轉發數據即可。

參考過這個文檔(如果知道上面怎麼處理可以不用繼續看了):

var http = require('http'),
 2     net = require('net'),
 3     app = http.createServer().listen('8181'),
 4     io = require('socket.io').listen(app),
 5     nodeServer = new net.Socket();
 6 // 連接到Tomcat
 7 nodeServer.connect(8007, '127.0.0.1', function() {
 8     console.log('CONNECTED');
 9 });
10 // 存儲客戶端的WebSocket連接實例
11 var aSocket = {};
12 // 同客戶端建立連接
13 io.sockets.on('connection', function (socketIO) {
14     // 從客戶端接收數據,然後發送至Tomcat
15     socketIO.on('fromWebClient', function (webClientData) {        
16         // 存儲至映射表
17         aSocket[socketIO.id] = socketIO;
18         // 發送至Tomcat的數據中添加socket_id
19         webClientData['sid'] = socketIO.id;        
20         // 發送String類型的數據至Tomcat
21         nodeServer.write(JSON.stringify(webClientData));        
22     });
23     // 客戶端斷開連接
24     socketIO.on('disconnect', function () {
25         console.log('DISCONNECTED FROM CLIENT');
26     });    
27 });
28 
29 // 從Tomcat接收數據
30 nodeServer.on('data', function (data) {  
31     var jsonData = JSON.parse(data.toString());    
32     // 分發數據至客戶端
33     for (var i in jsonData.list) {
34         aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data);
35     }
36 });

有這麼一句 aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data);
雖然它實現的是通過id來實現建立一一對應連接,但是它還是獨立出來使用了(查了一些資料都是在一起用的),
到底該怎麼實現呢?ps:不用管對應id問題,我只需要簡單實現轉發數據即可。
求大神幫助。

最佳回答:


已經解決了。有兩種解決方案。
1、從c服務器的代碼挪進io.sockets.on('connection')裡面,這樣就能在連接中訪問socket.id從而向客戶端發送數據。
2、像他一樣,利用一個全局變量存儲連接過程中的的所有socket.id,然後在c服務器數據到來時觸發,同時注意異步並發的問題。
非常感謝seg的id:何處春江無月明 的幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved