Bash和Java之间的通道通信:发送端
我想设置一个Java应用程序作为服务器,接受(阻止)来自Bash脚本的查询。Java部分是使用Bash和Java之间的通道通信:发送端,java,bash,nio,Java,Bash,Nio,我想设置一个Java应用程序作为服务器,接受(阻止)来自Bash脚本的查询。Java部分是使用nio编写的,它有一个如下所示的主循环: ServerSocketChannel ssc = ...; // bound to localhost:8011 Charset charset = ...; // Waits for connections forever. while(true) { SocketChannel sc = ssc.accept(); StringBuffer sb
nio
编写的,它有一个如下所示的主循环:
ServerSocketChannel ssc = ...; // bound to localhost:8011
Charset charset = ...;
// Waits for connections forever.
while(true) {
SocketChannel sc = ssc.accept();
StringBuffer sb = new StringBuffer();
int read = 0;
// Builds up a string representing the query.
while(true) {
ByteBuffer bb = ByteBuffer.allocate(1024);
read = sc.read(bb);
if(read == -1) break;
bb.flip();
CharBuffer cb = charset.decode(bb);
sb.append(cb.toString());
}
// Do something with the query.
sc.write(charset.encode(CharBuffer.wrap(sb.toString())));
sc.close();
}
Bash部分依赖于/dev/tcp/
魔术:
exec 3<> /dev/tcp/localhost/8011
echo "message" 1>&3
在我的Bash脚本中,但这没有帮助。尝试关闭文件描述符。Java应该将其视为一个封闭流,并允许内部循环终止
exec 3>&-
插座可能“半开”(即,在一个方向上关闭,但在另一个方向上仍然打开)。Socket
实例具有此状态
我还没有测试由bash
创建的管道套接字混合是否支持此功能。如果没有,则必须设计一个协议,其中包含一些内部长度编码或分隔序列,以指示消息边界
我试图实现的是让Java认为
通信暂时已结束,但可能稍后恢复
你需要明白这个要求在术语上是矛盾的。通信已结束或稍后可能会恢复。TCP中没有支持这一点的东西,Java中也没有。再想想,我可能误解了通道的工作原理。我试图实现的是让Java认为通信现在已经结束,但以后可能会恢复。不知何故,我认为这应该是一种不同于单纯关闭频道的行为,但这可能是错误的。也许我真正需要的是一个小小的协议,上面写着“这就是消息结尾的样子”。一个能为我澄清这一点的答案也是可以接受的。谢谢你的语法。问题是Java无法写入通道(即服务器无法“
对查询执行某些操作”
”)。@Philippe您尝试过吗?我还没有测试过它,但是一个插座可能是“半开的”(也就是说,在一个方向上关闭,但在另一个方向上仍然打开)。如果这不起作用,那么你真的需要问一个不同的问题(关于协议设计),因为你发布的协议似乎依赖于关闭输入,但保持输出打开;Java端抛出IOException“断管”。我也开始认为我的问题是错误的,因为我最初误解了-1
返回码对于读取
意味着什么(请参阅我自己在问题下的评论)。也许您可以编辑您的答案,将关流和半关流的评论包括在内?那我就可以接受了。
exec 3>&-