[新手]关于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 });
有这么一句 aSocketjsonData.list[i].emit('pushToWebClient', jsonData.list[i].data);
虽然它实现的是通过id来实现建立一一对应连接,但是它还是独立出来使用了(查了一些资料都是在一起用的),
到底该怎么实现呢?ps:不用管对应id问题,我只需要简单实现转发数据即可。
求大神帮助。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
下面的代码好像用了一个全局变量存储了所有
io.sockets.on('connection')
的连接实例。c服务器的数据在通过全局变量emit
。看的不是很仔细,不过有两种解决方法:
把你下面从c服务器的代码挪进
io.sockets.on('connection')
里面,这样就能在连接中访问socket.id
从而向客户端发送数据。像他一样,利用一个全局变量存储连接过程中的的所有
socket.id
,然后在c服务器数据到来时触发,注意异步并发的问题。