2011-06-20 3 views
4

何らかの理由で、ポートにメッセージを送信してバッファを介して読み込もうとしたときに、常にsocket.on('end')に届かないようにハングします。何か案は?ノードJSがバッファリングされたデータを読み取る

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'); 

*編集:ここでは、その後、読み取り後書き込み後socket_shutdown($sock, 1)socket_shutdown($sock, 0)を使用net.createServerでtrueにコマンドを送り、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; 
} 
+0

接続するクライアントを確認する必要があります。それは、接続を終了していないクライアントです。 – Raynos

+0

編集を参照してくださいありがとう! – fire

+0

@fire多分、PHPがデータを返すのを待っています。node.jsがデータを返す前にソケットを閉じるのを待っている間に( '.end(" ok ")') – Raynos

答えて

1

設定allowHalfOpenです。

関連する問題