我正在尝试使用 Node.js's ReadLine与 a socket ,就像这样:
var net = require('net');
var rl = require('readline');
this.streamServer = net.createServer(function (socket) {
var i = rl.createInterface(socket, socket);
i.on('line', function (line) {
socket.write(line);
});
});
this.streamServer.maxConnections = 1;
this.streamServer.listen(7001);
当我 telnet 到端口 7001 并开始输入文本时,它会在我按下 Enter 之前立即回显给我。
为什么 ReadLine 没有等待整行?
我也试过.question()我得到了相同的结果...在接收到任何数据时触发回调,而无需等待行尾字符。
编辑:这变得更奇怪了。当我使用 Windows telnet 客户端进行测试时,我得到了上述行为。但是,如果我使用 PuTTY 作为客户端进行测试,ReadLine 可以工作,即使在 Windows 上也是如此。我做了一些数据包捕获。也许有人可以对此有所了解?未缩进的行是来自客户端的数据。缩进的行是服务器回复。
使用 Windows Telnet
00000000 61 a
00000000 61 a
00000001 62 b
00000001 62 b
00000002 63 c
00000002 63 c
00000003 64 d
00000003 64 d
00000004 65 e
00000004 65 e
00000005 66 f
00000005 66 f
00000006 67 g
00000006 67 g
00000007 68 h
00000007 68 h
00000008 69 i
00000008 69 i
00000009 6a j
00000009 6a j
0000000A 6b k
0000000A 6b k
0000000B 6c l
0000000B 6c l
0000000C 6d m
0000000C 6d m
0000000D 6e n
0000000D 6e n
0000000E 6f o
0000000E 6f o
0000000F 70 p
0000000F 70 p
00000010 0d 0a ..
00000010 0d 0a ..
00000012 0d 0a ..
00000012 0d 0a ..
00000014 0d 0a ..
00000014 0d 0a ..
00000016 61 a
00000016 61 a
00000017 73 s
00000017 73 s
00000018 64 d
00000018 64 d
00000019 66 f
00000019 66 f
0000001A 0d 0a ..
0000001A 0d 0a ..
0000001C 61 a
0000001C 61 a
0000001D 73 s
0000001D 73 s
0000001E 64 d
0000001E 64 d
0000001F 66 f
0000001F 66 f
00000020 0d 0a ..
00000020 0d 0a ..
使用 PuTTY
00000000 ff fb 1f ff fb 20 ff fb 18 ff fb 27 ff fd 01 ff ..... .. ...'....
00000010 fb 03 ff fd 03 .....
00000000 ef bf bd ef bf bd 1f ef bf bd ef bf bd 20 ef bf ........ ..... ..
00000010 bd ef bf bd 18 ef bf bd ef bf bd 27 ef bf bd ef ........ ...'....
00000020 bf bd 01 ef bf bd ef bf bd 03 ef bf bd ef bf bd ........ ........
00000030 03 .
00000015 61 62 63 64 65 66 67 abcdefg
0000001C 0d 0a ..
00000031 61 62 63 64 65 66 67 abcdefg
00000038 0d 0a ..
0000001E 61 73 64 66 asdf
00000022 0d 0a ..
0000003A 61 73 64 66 asdf
0000003E 0d 0a ..
00000024 61 73 64 66 asdf
00000028 0d 0a ..
00000040 61 73 64 66 asdf
00000044 0d 0a ..
0000002A 0d 0a ..
00000046 0d 0a ..
最佳答案
这是 node.js 中的一个错误,ReadLine 的接口(interface)在每个 'data' 事件上调用 _normalWrite() 并且 _normaWrite 有一条注释说它应该尝试在换行符上换行,但目前它是 just calls _onLine() .
类似的东西应该会为你解决这个问题:
i._normalWrite = function(b) {
if(b == undefined) {
return;
}
if(!this._line_buffer) {
this._line_buffer = '';
}
this._line_buffer += b.toString();
if(this._line_buffer.indexOf('\n') !=-1 ) {
var lines = this._line_buffer.split('\n');
// either '' or the unfinished portion of the next line
this._line_buffer = lines.pop();
lines.forEach(function(line) {
this._onLine(line + '\n');
}, this);
}
};
我没有对此进行测试,可能还需要考虑 \r 。请让我知道它是否适合您,如果适合,那么我们中的一个应该向 Node 发送拉取请求。
关于javascript - Node.js ReadLine 不等待套接字连接的完整行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9962197/
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我有一个ruby脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?