【发布时间】: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)triggerson('end') -
是的,我就是这么想的,但显然不像它似乎挂起的那样。