【问题标题】:Node JS read in buffered dataNode JS读入缓冲数据
【发布时间】:2011-09-18 18:27:02
【问题描述】:

由于某种原因,当我向端口发送消息并尝试通过缓冲区读取它时,它总是挂起,因为似乎永远无法到达 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;
}

【问题讨论】:

  • 我们需要查看连接的客户端。没有结束连接的是客户端。
  • @fire 可能 PHP 在关闭之前等待数据返回,而 node.js 在发送数据之前等待套接字关闭 (.end("ok"))
  • 是的,当我运行 PHP 时它挂起,因为节点没有到达 socket.on('end') 代码,但是我该如何解决这个问题?
  • @fire socket_close($sock) triggers on('end')
  • 是的,我就是这么想的,但显然不像它似乎挂起的那样。

标签: php sockets node.js


【解决方案1】:

net.createServer 中将allowHalfOpen 设置为true,然后在写入后使用socket_shutdown($sock, 1),在读取后使用socket_shutdown($sock, 0)

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多