php - Node JS 读入缓冲数据

标签 php sockets node.js

出于某种原因,当我向端口发送消息并尝试通过缓冲区读取它时,它总是挂起,因为似乎永远不会到达 socket.on('end') 。有什么想法吗?

var net = require('net');
var buffer = [];

var server = net.createServer(function(socket) {

    socket.on('data', function(data) {
        buffer.push(data);
    });

    socket.on('end', function() {
        try {
            var data = buffer.join("");
            console.log(data);
            socket.end('ok');

        } catch (e) {
            console.log('Error: ' + e.message);
            return;
        }
    });
});

server.listen(3000, '127.0.0.1');

*编辑:这是发送命令的 PHP...

public function sendDaemonCommand($address, $template_id, $params = array()) {

    $port = 3000;
    $command = array('template_id' => $template_id, 'params' => $params);
    $command = json_encode($command);

    // Create a TCP Stream socket
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
        $this->logError("Failed to create socket on " . $address . "\n\n" . socket_strerror(socket_last_error()) . "\n\nCommand:\n\n" . $command . "\n" . $this->functionTraceback());
        return false;
    }

    // Connect to socket
    if (socket_connect($sock, $address, $port) === false) {
        $this->logError("Failed to connect to socket on " . $address . "\n\n" . socket_strerror(socket_last_error($sock)) . "\n\nCommand:\n\n" . $command. "\n" . $this->functionTraceback());
        socket_close($sock);
        return false;
    }

    // Write command to socket
    if (socket_write($sock, $command) === false) {
        $this->logError("Failed to write command to socket on " . $address . "\n\n" . socket_strerror(socket_last_error($sock)) . "\n\nCommand:\n\n" . $command. "\n" . $this->functionTraceback());
        socket_close($sock);
        return false;
    }

    // Read back from socket
    if (($out = socket_read($sock, 1024)) !== false) {
        $out = trim($out);
        if ($out == "") {
            $this->logError("No message received back from socket on " . $address . "\n\n" . socket_strerror(socket_last_error($sock)) . "\n\nCommand:\n\n" . $command. "\n" . $this->functionTraceback());
            socket_close($sock);
            return false;
        }
    }
    else {
        $this->logError("Failed to read from socket on " . $address . "\n\n" . socket_strerror(socket_last_error($sock)) . "\n\nCommand:\n\n" . $command. "\n" . $this->functionTraceback());
        socket_close($sock);
        return false;
    }

    socket_close($sock);
    return $out;
}

最佳答案

net.createServer 中将 allowHalfOpen 设置为 true 然后在 write 和 socket_shutdown($ sock, 0) 读取后。

关于php - Node JS 读入缓冲数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412944/

相关文章:

javascript - 用于 Rocket Chat iframe 身份验证的 NodeJS 应用程序抛出 SyntaxError : Unexpected token (

node.js - 在 Mocha ExpressJS 测试期间获取 "Error: the string "不是有效的 BCrypt 哈希 ."was thrown, throw an Error :)"

javascript - html和node.js之间的通信(基础)

php - 为什么我无法获取此文本区域的值?

php - 除了随机 ID 检索之外,在表中存储数据的最简单数据库解决方案是什么?

php - 使用节标题和节行解析 JSON

java - 如何使用 spring 集成在 TCP 连接上实现保持连接?

android - 是否可以通过套接字连接在Cordova和Native Android之间进行通信?

PHP & C++ 获取用户 IP

c - 使用 C 发送电子邮件