加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Node JS读入缓冲数据

发布时间:2020-12-13 22:30:58 所属栏目:PHP教程 来源:网络整理
导读:出于某种原因,当我向端口发送消息并尝试通过缓冲区读取消息时,它总是挂起,因为socket.on(‘end’)似乎永远不会到达.有任何想法吗? var net = require('net');var buffer = [];var server = net.createServer(function(socket) { socket.on('data',function(
出于某种原因,当我向端口发送消息并尝试通过缓冲区读取消息时,它总是挂起,因为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 . "nn" . socket_strerror(socket_last_error()) . "nnCommand:nn" . $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 . "nn" . socket_strerror(socket_last_error($sock)) . "nnCommand:nn" . $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 . "nn" . socket_strerror(socket_last_error($sock)) . "nnCommand:nn" . $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 . "nn" . socket_strerror(socket_last_error($sock)) . "nnCommand:nn" . $command. "n" . $this->functionTraceback());
            socket_close($sock);
            return false;
        }
    }
    else {
        $this->logError("Failed to read from socket on " . $address . "nn" . socket_strerror(socket_last_error($sock)) . "nnCommand:nn" . $command. "n" . $this->functionTraceback());
        socket_close($sock);
        return false;
    }

    socket_close($sock);
    return $out;
}

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读