如標題,接收到了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、從c服務器的代碼挪進io.sockets.on('connection')裡面,這樣就能在連接中訪問socket.id從而向客戶端發送數據。
2、像他一樣,利用一個全局變量存儲連接過程中的的所有socket.id,然後在c服務器數據到來時觸發,同時注意異步並發的問題。
非常感謝seg的id:何處春江無月明 的幫助。