我正在尝试在我用PHP创建的应用程序和Node.JS之间建立一个桥梁。
Node.JS创建套接字并监听它,我的代码:
var net = require('net'),
fs = require('fs');
var path = '/tmp/echo.sock';
fs.unlink(path, function () {
var server = net.createServer(function(c) {
console.log('server connected');
c.on('close', function() {
console.log('server disconnected');
});
c.write('hello\r\n');
c.on('data', function(data) {
console.log('Response: "' + data + '"');
c.write('You said "' + data + '"');
});
});
server.listen(path, function(e) {
console.log('server bound on %s', path);
});
});
process.on('uncaughtException', function (err) {
console.log( "UNCAUGHT EXCEPTION " );
console.log( "[Inside 'uncaughtException' event] " + err.stack || err.message );
});
我的PHP代码只是连接存在套接字并发送一些数据:
$fp = fsockopen("unix:///tmp/echo.sock", -1, $errno, $errstr);
if (!$fp) {
return "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "Hello World <3");
$out = fread($fp, 8192);
fclose($fp);
return $out; // That code is in function.
}
一切都应该有效,但在Node.JS控制台中,我看到了响应:
server bound on /tmp/echo.sock
server connected
Response: "Hello World <3"
UNCAUGHT EXCEPTION
[Inside 'uncaughtException' event] Error: write EPIPE
at exports._errnoException (util.js:745:11)
at Object.afterWrite (net.js:763:14)
server disconnected
在PHP中,我只看到第一条消息hello
。为什么以及如何解决这个问题?
答案 0 :(得分:0)
试试这个;
<?php
$fp = fsockopen("unix:///tmp/echo.sock", -1, $errno, $errstr);
if (!$fp) {
return "ERROR: $errno - $errstr<br />\n";
} else {
$out = fread($fp, 8192);
fwrite($fp, "Hello World <3");
$out2 = fread($fp, 8192);
fclose($fp);
echo $out; // That code is in function.
echo $out2; // That code is in function.
}
?>
答案 1 :(得分:0)
我知道问题出在哪里。在PHP中,我在写入数据后关闭与管道的连接。 Node尝试编写响应但不能,因为PHP中的连接已经关闭。所以,我刚刚添加检查是连接还在。当然,下面的内容不是用于制作,只是为了说明它是如何工作的。
Node.JS代码:
var net = require('net'),
fs = require('fs');
var path = '/tmp/echo.sock',
toSend = 1,
sended = 0;
fs.unlink(path, function () {
var server = net.createServer(function(c) {
console.log('server connected');
c.on('close', function() {
console.log('server disconnected');
});
c.write('hello\r\n');
c.on('data', function(data) {
console.log('Response: "' + data + '"');
if( data == "IS_ALREADY_CLOSED" & toSend == sended ) {
c.write('ALREADY_CLOSED');
return;
} else {
c.write('NOT_ALREADY_CLOSED');
return;
}
c.write('You said "' + data + '"');
sended++;
});
});
server.listen(path, function(e) {
console.log('server bound on %s', path);
});
});
process.on('uncaughtException', function (err) {
console.log( "UNCAUGHT EXCEPTION " );
console.log( "[Inside 'uncaughtException' event] " + err.stack || err.message );
});
在PHP中:
$fp = fsockopen("unix:///tmp/echo.sock", -1, $errno, $errstr);
if (!$fp) {
return "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "Hello World <3");
do {
$output = fread($fp, 8192);
if($output == "ALREADY_CLOSED") break;
elseif( $output == "NOT_ALREADY_CLOSED" ) continue;
echo $output . "\n";
fwrite($fp, "IS_ALREADY_CLOSED");
} while(true);
fclose($fp);
}