【问题标题】:How to access a Child Process' sockets in NodeJS?如何在 NodeJS 中访问子进程的套接字?
【发布时间】:2015-03-14 08:38:28
【问题描述】:

我目前遇到了一个非常奇怪的问题。

我正在尝试使用 NodeJS 子进程启动 VLC,然后使用套接字访问它的远程控制 (RC) 接口。连接到此套接字时会出现问题。我收到一个错误,连接被拒绝。端口已打开,并且允许应用程序从防火墙访问。

棘手的部分是,当我使用此接口手动打开 VLC,并且只尝试在套接字上连接时,它可以工作。我假设生成过程中的某些东西会使事情有所不同,从而以某种方式导致错误。

这是我要运行的代码:

var spawn = require('child_process').spawn;

var file_dir = "V:\\TEST\\";
var files = ["Ika.mkv", "Nami.mkv", "Azu.mkv"];

var player = spawn("C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe", ['--intf="rc"', '--rc-host="localhost:3000"', '--fullscreen', file_dir + files[0]]);

var net = require('net');
var client = net.createConnection(3000, "localhost");

client.on('connect', function() {
    console.log('connected to VLC on port 3000');
    client.write("add " + file_dir + files[1] + "\n");
    client.write("enqueue " + file_dir + files[2] + "\n");

    client.write("help" + "\n");
});

client.on('data', function(data) {
    console.log(data.toString());
});

client.on('end', function() {
    console.log('disconnected from server');
});

我在两台机器上试过这段代码,我遇到了同样的问题。

您可能会问的一些问题: 什么操作系统? Windows 8.1

为什么需要使用套接字? VLC 没有任何从标准输入或标准输出读取和写入的接口。我尝试了许多不同的选择,但它们根本无济于事。

我要构建什么? 带有 Web 界面的媒体中心。我正在使用 VLC 作为媒体播放器。

不能使用内置的 HTTP 接口吗? 它不适合我想要构建的东西。我想更好地控制我的媒体管理。


欢迎任何和所有的帮助。谢谢。


【问题讨论】:

  • 这可能是一个时间问题,您需要等待生成的应用程序完成初始化,然后再尝试连接它?
  • 我刚试过这个,我只用生成的进程启动了一个实例,另一个只用网络连接,第二个应用程序以同样的方式出错。被拒绝。我真的不认为这是问题所在,因为我确实总是短暂地看到 VLC 出现,然后我的应用程序会抛出错误,并且 VLC 会在应用程序退出时关闭。
  • 仅仅因为你在视觉上看到了一些东西,并不意味着它已经准备好及时连接。如果您真的想将其排除在测试之外,请将所有客户端连接代码放在 setTimeout() 中,等待 30 秒后再建立连接。
  • 这仍然不是问题,如果我这样做,应用程序会在 30 秒内崩溃。同样的原因,无法连接到 VLC 进程。所以这似乎不是一个时间问题。我想知道子进程是否甚至创建了套接字。
  • 听起来它没有在你认为的套接字上监听。您可以正常运行程序,然后在以管理员权限运行的 Windows 控制台窗口中运行netstat -ab | more(因此它可以看到所有进程),它会显示哪些进程有侦听套接字。

标签: node.js sockets vlc child-process


【解决方案1】:

由于某种奇怪的原因,并非所有命令行参数都传递给 VLC 实例。

我通过将 RC 接口的实例化和将 RC 模式设置为 localhost:3000 组合在一起解决了这个问题

这是产生进程的新行

var player = spawn("C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe", ['-I rc --rc-host=\"localhost:3000\"','--fullscreen', file_dir + files[0]]);

这可行,唯一的缺点是它还创建了一个 RC 控制台窗口,但我可以忍受它。

感谢@jfriend00 帮助解开这个奇怪的谜团。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多