Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash和Java之间的通道通信:发送端_Java_Bash_Nio - Fatal编程技术网

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

我想设置一个Java应用程序作为服务器,接受(阻止)来自Bash脚本的查询。Java部分是使用
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>&-