gpt4 book ai didi

java - Bash 和 Java 之间的通信, channel 为 : sending end-of-transmission

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:49 30 4
gpt4 key购买 nike

我想设置一个用作服务器的 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 部分(如果我在内部循环中添加一个 System.out.println(cb);,我可以看到这些部分),但除非我终止 Bash 脚本,否则内部循环不会终止。

我的问题真的很简单:Bash 脚本如何向 Java 服务器发出其通信已结束的信号?我试过添加

echo -en "\004" 1>&3 

在我的 Bash 脚本中,但这没有帮助。

最佳答案

尝试关闭文件描述符。这应该被 Java 视为一个封闭的流,并允许内部循环终止。

exec 3>&-

套接字可以“半开”(即,在一个方向上关闭但在另一个方向上仍然打开)是可能的。 Socket 实例有 methods to detect这个状态。

我还没有测试 bash 创建的管道-套接字混合体是否支持这个。如果没有,您将不得不设计一个协议(protocol),其中包含一些内部长度编码或定界序列来指示消息边界。

关于java - Bash 和 Java 之间的通信, channel 为 : sending end-of-transmission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9266168/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com