TDArray 2016-12-27 02:29 采纳率: 0%
浏览 2281
已采纳

[新手]关于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条回答

  • TDArray 2016-12-27 07:53
    关注

    已经解决了。有两种解决方案。
    1、从c服务器的代码挪进io.sockets.on('connection')里面,这样就能在连接中访问socket.id从而向客户端发送数据。
    2、像他一样,利用一个全局变量存储连接过程中的的所有socket.id,然后在c服务器数据到来时触发,同时注意异步并发的问题。
    非常感谢seg的id:何处春江无月明 的帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!