控制字符的 Socket.IO 问题
Posted
技术标签:
【中文标题】控制字符的 Socket.IO 问题【英文标题】:Socket.IO issue with control chars 【发布时间】:2011-11-03 15:03:58 【问题描述】:我正在实现一个使用 websockets 和一个通过 Telnet 访问的控制台的应用程序。通过 websockets 建立的连接与控制台之间存在通信。我遇到了一个奇怪的问题:
如果我在控制台中输入内容时将字符串常量发送到已建立的套接字,它可以正常工作。 如果我发送从控制台范围接收到的字符串,它似乎打开了一个新套接字(不确定),因为在调试日志中我看到了它,并且在浏览器端(websockets)它提醒我有一个新的连接。李> 如果我发送一个本地字符串(而不是从另一个作用域接收的那个),它就会正确发送。 (注释行:client.send(message))我在这里分享 nodeJS 代码,考虑到这现在是一个测试应用,所以假设只有一个套接字和 websockets 连接:
// Sample based on: http://elegantcode.com/2011/05/04/taking-baby-steps-with-node-js-websockets/
// Changed for sockets.io 6.x => 7.x
var events = require('events');
var eventEmitter = new events.EventEmitter();
var http = require('http');
var socketIO = require('socket.io');
var static = require('node-static');
var port = 2000;
var clientFiles = new static.Server('./client');
var httpServer = http.createServer(
function(request, response)
request.addListener('end', function()
clientFiles.serve(request, response);
);
)
httpServer.listen(port);
console.log("Server running at port: " + port);
var io = require('socket.io').listen(httpServer);
var webSocket = io.sockets;
webSocket.on('connection', function(client)
client.send('Please enter a user name ...');
var userName;
eventEmitter.on('someOccurence', function(message)
console.log("Received: " + message);
client.send('Line Received');
var s = 'popo';
client.send(s);
//client.send(message);
);
client.on('message', function(message)
console.log(message);
if(!userName)
userName = message;
client.broadcast.send(message + ' has entered the zone.');
return;
var broadcastMessage = userName + ': ' + message;
client.broadcast.send(broadcastMessage);
client.send("Repeated here: " + message);
);
client.on('disconnect', function()
var broadcastMessage = userName + ' has left the zone.';
client.broadcast.send(broadcastMessage);
);
);
var lines = require('lines-adapter');
var net = require('net');
var server = net.createServer(function (socket)
socket.write("Welcome to the Server\r\n");
lines(socket, 'utf8')
.on("data",
function(line)
console.log("Line received: " + line);
eventEmitter.emit('someOccurence', line);
)
.end("end",
function()
console.log("End of Stream");
);
);
server.listen(1337, "127.0.0.1");
更新:我刚刚使用 socket.io 0.8.6 和 nodeJS 0.4.12 进行了测试,没有这个问题。我将把这个问题留在这里以供将来参考。
【问题讨论】:
进一步研究我可以看到该错误位于 socket.io 代码周围,因为如果我使用 nodejs 下的 net 库和两个侦听服务器测试相同的代码,一切正常。目前我不知道我的代码、socket.io 或 nodeJS 中是否存在错误。 更多信息:它似乎与 telnet 控制字符和/或“\n”有关 嗯,我似乎无法复制这个问题。从控制台范围收到的字符串“如果我发送从控制台范围收到的字符串 [...]”是什么意思? 你用的是什么socket.io版本? 我在github上找到的最新的。 【参考方案1】:在 socket.io v0.8.6 中修复。这个 q 应该被回答/关闭。
【讨论】:
【参考方案2】:这只是需要在本地动态分配内存的一种情况。当字符串进入时,您应该将字符串的字符串复制到动态分配的相同长度的字符串中。问题解决了。
【讨论】:
javascript 中的字符串是不可变的。 我也尝试过这种奇怪的处理方式,但没有用。以上是关于控制字符的 Socket.IO 问题的主要内容,如果未能解决你的问题,请参考以下文章