node.js + socket.io +递归添加回复

时间:2016-10-17 00:56:04

标签: node.js socket.io

我拼凑了一个网页,通过其串口控制Onkyo接收器,使用了我主要在stackexchange上找到的几个不同示例的部分。它运行良好,但我遇到了@ user568109在下面的第一个链接中突出显示的问题,我认为我已经“从您的路由中初始化连接事件监视器”而不是全局。 (每次刷新网页时,发送的回复数量都会增加一个。)问题是我无法看到如何全局初始化它。我尝试删除该功能:

self.fromMainOp = [NSBlockOperation blockOperationWithBlock:^{
    ViewController *innerSelf = weakSelf;
    while (![innerSelf.fromMainOp isCancelled])
    {
        usleep(1000000) ;
        NSLog(@"Main OP QOS is %ld",innerSelf.fromMainOp.qualityOfService);
    }
}];

但是留下.......部分,就像在下面的第二个链接中成功完成一样,但这对我的情况不起作用。有一个简单的解决方案吗?我是节点和javascript的新手,所以我希望对某人来说很明显。

除了每次刷新网页时的其他回复,它都运行良好。 (除了初始化开关开关,单选按钮和音量滑块正确初始化,但是一旦我将这个套接字分类出来,我会尝试解决这个问题)。 谢谢!

Socket.io emits duplicate data after browser refresh

node.js + socket.io - duplicate websocket writes?

以下是代码段:

io.sockets.on('connection', function (socket) {......}
var express = require('express');
app 		= express();
server 		= require('http').createServer(app);
io  		= require('socket.io').listen(server);
var SerialPort = require("serialport")
var serialPort = new SerialPort("/dev/ttyUSB0", { 
		baudRate: 9600,
		dataBits: 8,
		parity: 'none',
		stopBits: 1
  		}
	);
server.listen(8080);
app.use(express.static('public'));             
io.sockets.on('connection', function (socket) {
        socket.on('toOnkyo', function (data) {
                paramVal = data.value;
                var buf = new Buffer(16);                
				buf.write(paramVal, "utf-8");
                serialPort.write(buf);
				io.sockets.emit('toOnkyo', {value: paramVal});   
				});

		serialPort.on('data', function(data) {
				io.sockets.emit('onkyoReply', {value: data.toString().substr(0,7)});
				});
		
});
console.log("running");
body {
	text-align: center;
	margin-top: 50px;
	background: #50D0A0;
}

input[type=range]{
	-webkit-appearance: none;
	width: 80%;
}

input[type=range]::-webkit-slider-runnable-track {
	height: 10px;
	background: #ddd;
	border: none;
	border-radius: 3px;
}

input[type=range]::-webkit-slider-thumb {
	-webkit-appearance: none;
	border: none;
	height: 32px;
	width: 32px;
	border-radius: 50%;
	background: goldenrod;
	margin-top: -12px;
}

input[type=range]:focus {
	outline: none;
}

input[type=range]:focus::-webkit-slider-runnable-track {
	background: #ccc;
}
.radioLeft
{
    text-align:left;
}



.onoffswitch {
    position: relative; width: 90px;
    -webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;
}
.onoffswitch-checkbox {
    display: none;
}
.onoffswitch-label {
    display: block; overflow: hidden; cursor: pointer;
    border: 2px solid #999999; border-radius: 20px;
}
.onoffswitch-inner {
    display: block; width: 200%; margin-left: -100%;
    transition: margin 0.3s ease-in 0s;
}
.onoffswitch-inner:before, .onoffswitch-inner:after {
    display: block; float: left; width: 50%; height: 30px; padding: 0; line-height: 30px;
    font-size: 14px; color: white; font-family: Trebuchet, Arial, sans-serif; font-weight: bold;
    box-sizing: border-box;
}
.onoffswitch-inner:before {
    content: "ON";
    padding-left: 10px;
    background-color: #34A7C1; color: #FFFFFF;
}
.onoffswitch-inner:after {
    content: "OFF";
    padding-right: 10px;
    background-color: #EEEEEE; color: #999999;
    text-align: right;
}
.onoffswitch-switch {
    display: block; width: 18px; margin: 6px;
    background: #FFFFFF;
    position: absolute; top: 0; bottom: 0;
    right: 56px;
    border: 2px solid #999999; border-radius: 20px;
    transition: all 0.3s ease-in 0s; 
}
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
    margin-left: 0;
}
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
    right: 0px; 
}

1 个答案:

答案 0 :(得分:0)

找到一个基于Ian Wooten博客的解决方案:

http://www.ianwootten.co.uk/2011/07/04/maintaining-references-to-sockets-with-express-and-socket-io/

大!

server.listen(8080);
app.use(express.static('public'));             
var paramVal = 0;
var countRep = 0;
var countSend = 0;
var buf = new Buffer(16);
var global_socket;

io.sockets.on('connection', function (socket) {
		global_socket = socket;
        global_socket.on('toOnkyo', function (data) {
                paramVal = data.value;
				buf.write(paramVal, "utf-8");
                serialPort.write(buf);
				console.log(paramVal.toString().substr(0,7) + " (" + parseInt(paramVal.toString().substr(5,2),16) + ")\r\n");				
                global_socket.emit('toOnkyo', {value: paramVal});   
				console.log('new'+paramVal);
				countSend=countSend+1;
				console.log('count send '+ countSend);
				
				});
});
				serialPort.on('data', function(data) {
				console.log('data received: ' + data.toString().substr(0,7) + " (" + parseInt(data.toString().substr(5,2),16) + ")");
				global_socket.emit('onkyoReply', {value: data.toString().substr(0,7)});
				countRep=countRep+1;
				console.log('count '+ countRep);
				});

console.log("running");