- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
PHP 中的 fgetc() 函数在 Node.js 中的等效项是什么?我如何将它应用于套接字?
我正在处理此 php 脚本的 node.js 端口: http://code.google.com/p/bf2php/source/browse/trunk/rcon/BF2RConBase.class.php
基本上它使用套接字连接到基于战地风云 2 的游戏服务器。我正在查看的功能是:
protected function read($bare = false) {
$delim = $bare ? "\n" : "\x04";
for($buffer = ''; ($char = fgetc($this->socket)) != $delim; $buffer .= $char);
return trim($buffer);
}
它应该直接从套接字(从我收集的)中获取第一行,一次一个字符,直到'\n'。我假设输出用于获取加密盐。该函数在套接字连接事件中被调用,作为生成登录所需的加密密码的代码的一部分。谁能告诉我这个函数的 Node.js 等价物是什么样子的?
最佳答案
docs有一个很好的例子,说明如何通过网络连接到服务器。
var net = require('net');
var client = net.connect({port: 8124},
function() { //'connect' listener
console.log('client connected');
client.write('world!\r\n');
});
client.on('data', function(data) {
console.log(data.toString());
client.end();
});
client.on('end', function() {
console.log('client disconnected');
});
只需更改 data
事件处理程序以缓冲传入数据,直到您收到所需的信息。
为此,您需要了解如何使用 Buffer
.
下面是一个具体示例,说明如何从流中缓冲数据并解析由特定字符分隔的消息。我在链接的 PHP 中注意到,您尝试实现的协议(protocol)使用 EOT (0x04) 字符分隔消息。
var net = require('net');
var max = 1024 * 1024 // 1 MB, the maximum amount of data that we will buffer (prevent a bad server from crashing us by filling up RAM)
, allocate = 4096; // how much memory to allocate at once, 4 kB (there's no point in wasting 1 MB of RAM to buffer a few bytes)
, buffer=new Buffer(allocate) // create a new buffer that allocates 4 kB to start
, nread=0 // how many bytes we've buffered so far
, nproc=0 // how many bytes in the buffer we've processed (to avoid looping over the entire buffer every time data is received)
, client = net.connect({host:'example.com', port: 8124}); // connect to the server
client.on('data', function(chunk) {
if (nread + chunk.length > buffer.length) { // if the buffer is too small to hold the data
var need = Math.min(chunk.length, allocate); // allocate at least 4kB
if (nread + need > max) throw new Error('Buffer overflow'); // uh-oh, we're all full - TODO you'll want to handle this more gracefully
var newbuf = new Buffer(buffer.length + need); // because Buffers can't be resized, we must allocate a new one
buffer.copy(newbuf); // and copy the old one's data to the new one
buffer = newbuf; // the old, small buffer will be garbage collected
}
chunk.copy(buffer, nread); // copy the received chunk of data into the buffer
nread += chunk.length; // add this chunk's length to the total number of bytes buffered
pump(); // look at the buffer to see if we've received enough data to act
});
client.on('end', function() {
// handle disconnect
});
client.on('error', function(err) {
// handle errors
});
function find(byte) { // look for a specific byte in the buffer
for (var i = nproc; i < nread; i++) { // look through the buffer, starting from where we left off last time
if (buffer.readUInt8(i, true) == byte) { // we've found one
return i;
}
}
}
function slice(bytes) { // discard bytes from the beginning of a buffer
buffer = buffer.slice(bytes); // slice off the bytes
nread -= bytes; // note that we've removed bytes
nproc = 0; // and reset the processed bytes counter
}
function pump() {
var pos; // position of a EOT character
while ((pos = find(0x04)) >= 0) { // keep going while there's a EOT (0x04) somewhere in the buffer
if (pos == 0) { // if there's more than one EOT in a row, the buffer will now start with a EOT
slice(1); // discard it
continue; // so that the next iteration will start with data
}
process(buffer.slice(0,pos)); // hand off the message
slice(pos+1); // and slice the processed data off the buffer
}
}
function process(msg) { // here's where we do something with a message
if (msg.length > 0) { // ignore empty messages
// here's where you have to decide what to do with the data you've received
// experiment with the protocol
}
}
完全未经测试,因此可能存在错误。这里要收集的主要内容是,当数据到达时,您将其缓冲在内存中。一旦在缓冲区中找到定界符,就可以处理该消息。
关于php - Node.js 套接字的 php 的 fgetc() 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12789183/
#include #include #include int main() { FILE *userfile, *pwfile, *usernamesPass
我正在使用 fgetc 从文本文件读取和验证流,一次一个字符,但由于某种原因它会重新排序字符。该文本文件包含类似“abc”的内容 void newFunction(int i, int j, int
我正在使用 fgetc 和字符计数方法来循环遍历字 rune 件并以相反的顺序返回它们。当我尝试这样做时,发生了两件意想不到的事情。当我将循环的第二次迭代粘贴到第一次迭代下方时,它返回一个非常不同的、
我正在尝试读取一个文件,直到遇到 1 到 5 之间的随机 int,然后将该 int 旁边的单词读入数组。在尝试将随机 int 与 fgetc() 的返回值进行比较之前,代码运行良好(它将字符读入数组直
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
目前,我正在读取 execlp 的子程序的输入行。所以基本上,如果子程序无法正确执行,它在读取时不应该是管道信息,并且会抛出错误。 我尝试轮询文件描述符,无论程序是否正确执行,它都会返回一个。所以基本
我正在尝试使用 fgetc() 函数逐字符读取文本文件,但它不显示任何输出。这是一个学校项目,仍然以非常非常简单的方式只是为了测试程序的功能。 #include #include void fn1
在 while 循环中,fgetc 命令跳过第一个字符,我似乎不明白为什么。 void generate_people(FILE *p, struct person *a){ int c;
所以我正在开发一个函数,该函数将使用 fgetc 将一行读入缓冲区。所以我可以随意使用该缓冲区,然后用下一行重新填充缓冲区。我的函数可以工作,但是我必须在 for 循环之外重复代码才能处理最后一行,如
我有一个文件 data.dat HI5 LO2 我想从中读取 5 和 2,并将它们存储为 uint16。我已经写了 #include int main() { unsigned short
我试图让 fgetc 读取文件并从某个指示器跳过直到新行。这似乎是一个简单的问题,但我找不到任何相关文档。 这是我的问题的示例: read this in ; skip from semicolon
int ch; char Name1[24], Name2[24],*p1,*p2; while ((ch = fgetc(inz)) != EOF){ fseek(inz,
这个问题已经有答案了: Difference between int and char in getchar/fgetc and putchar/fputc? (2 个回答) 已关闭 6 年前。 以下
这个问题已经有答案了: fgetc(stdin) in a loop is producing strange behaviour (4 个回答) 已关闭 5 年前。 我正在尝试使用 C 语言 fge
我正在测试 fgetc() 函数,但它无法正常工作(我以前使用过这个函数,所以我知道它是如何工作的) #include #include int main() { FILE *file =
我有一个类似于 7 4 5 1 等的文件。我想将这些数字放入多维数组中。 for(x=0;x 下次执行循环时,y == 2,您会读取'4',并将其放入sudokuArray[0][2]. 所以 fge
我有代码块,我在某个循环中执行它并期望得到具体结果: 代码: fseek(file, start_seek_position, SEEK_SET); cout file = fopen(file_n
我使用函数fgetc读取文件的每个字节,然后用printf写入。 我只是注意到,当我将结果与十六进制编辑器进行比较时,fgetc 有时会遗漏一些字节。 比如第一个错误是从第118个字节左右开始的,其他
我在编写这段代码时遇到了一些麻烦。我可以让它在其他地方编译,但是当我尝试在我的机器上编译时,我遇到了段错误。 这是我收到的错误消息: 0x0000000000400dc6 in readFile (k
我希望我不会因为这个而很快被否决,但我有一个我正在为学校工作的项目,我必须在其中构建一个拼写检查器。我决定使用 trie,它似乎工作正常,但我有一个我找不到的错误。我认为问题出在以下, bool lo
我是一名优秀的程序员,十分优秀!