出于某种原因,当我向端口发送消息并尝试通过缓冲区读取消息时,它始终挂起,因为似乎永远不会到达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;
}
答案 0 :(得分:1)
在allowHalfOpen
中将net.createServer
设置为true,然后在写入后使用socket_shutdown($sock, 1)
,在阅读后使用socket_shutdown($sock, 0)
。