如标题,接收到了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};
}
}();**
客户端部分:(很多无用的就贴关键的了,其实这个可以暂时无视)
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
下面的代码好像用了一个全局变量存储了所有
io.sockets.on('connection')的连接实例。c服务器的数据在通过全局变量emit。看的不是很仔细,不过有两种解决方法:
把你下面从c服务器的代码挪进
io.sockets.on('connection')里面,这样就能在连接中访问socket.id从而向客户端发送数据。像他一样,利用一个全局变量存储连接过程中的的所有
socket.id,然后在c服务器数据到来时触发,注意异步并发的问题。