[新手]关于socket.io接收tcp服务器数据后转发给客户端的问题【一句话就能解决?】

发布于 2022-09-04 08:49:26 字数 4557 浏览 16 评论 0

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

有这么一句 aSocketjsonData.list[i].emit('pushToWebClient', jsonData.list[i].data);
虽然它实现的是通过id来实现建立一一对应连接,但是它还是独立出来使用了(查了一些资料都是在一起用的),
到底该怎么实现呢?ps:不用管对应id问题,我只需要简单实现转发数据即可。
求大神帮助。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ζ澈沫 2022-09-11 08:49:26

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文