java 命名管道_利用Windows命名管道实现IPC的一种有效方法

我正在使用

jna

模块连接两个同时执行FFMPEG命令的进程。发送

SDTOUT

服务器端的FFMPEG命令到NampedPipe和receive

STDIN

我就是这样捕捉的

STDOUT

并发送到服务器端的管道:

InputStream out = inputProcess.getInputStream();

byte[] buffer = new byte[maxBufferSize];

while (inputProcess.isAlive()) {

int no = out.available();

if (no > 0 && no > maxBufferSize) {

int n = out.read(buffer, 0,maxBufferSize);

IntByReference lpNumberOfBytesWritten = new IntByReference(maxBufferSize);

Kernel32.INSTANCE.WriteFile(pipe, buffer, buffer.length, lpNumberOfBytesWritten, null);

}

}

标准丁

OutputStream in = outputProcess.getOutputStream();

while (pipeOpenValue >= 1 && outputProcess.isAlive() && ServerIdState) {

// read from pipe

resp = Kernel32.INSTANCE.ReadFile(handle, readBuffer,readBuffer.length, lpNumberOfBytesRead, null);

// Write to StdIn inputProcess

if (outputProcess != null) {

in.write(readBuffer);

in.flush();

}

// check pipe status

Kernel32.INSTANCE.GetNamedPipeHandleState(handle, null,PipeOpenStatus, null, null, null, 2048);

pipeOpenValue = PipeOpenStatus.getValue();

WinDef.ULONGByReference ServerId = new WinDef.ULONGByReference();

ServerIdState = Kernel32.INSTANCE.GetNamedPipeServerProcessId(handle, ServerId);

}

但我面临两个问题:

由于在服务器和客户端中迭代两个循环,CPU使用率很高。(通过VisualVM分析资源来查找)

|

命令提示符。速度取决于缓冲区的大小,但大的缓冲区大小会阻碍操作,而较小的缓冲区则会进一步降低速度。

问题:

有没有办法不发送和接收字节块?只是流

到名称管道并在客户端中捕获它。(消除两个回路)

如果我不能使用NAMPPEDPPIPE,是否有其他方法连接在不同java模块中但在同一台机器中运行的两个FFMPEG进程?

谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值