javascript - [新手]关于socket.io接收tcp服务器数据后转发给客户端的问题【一句话就能解决?】
PHPz
PHPz 2017-04-11 10:59:42
[JavaScript讨论组]

如标题,接收到了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};
  }
}();**

客户端部分:(很多无用的就贴关键的了,其实这个可以暂时无视)

            
            
            
            
            
            
            
            
            
            
            
            

            
PHPz
PHPz

学习是最好的投资!

全部回复(1)
巴扎黑

下面的代码好像用了一个全局变量存储了所有io.sockets.on('connection')的连接实例。c服务器的数据在通过全局变量emit

看的不是很仔细,不过有两种解决方法:

  1. 把你下面从c服务器的代码挪进io.sockets.on('connection')里面,这样就能在连接中访问socket.id从而向客户端发送数据。

  2. 像他一样,利用一个全局变量存储连接过程中的的所有socket.id,然后在c服务器数据到来时触发,注意异步并发的问题。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号