Я бы хотел настроить приложение 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
Iможно увидеть, что сообщение, отправленное из Bash, достигает части Java (если я добавлю System.out.println(cb);
во внутренний цикл, я смогу увидеть части), но внутренний цикл не завершится, если я не уничтожу скрипт Bash.
Мой вопрос на самом деле довольно прост: как скрипт Bash может сигнализировать серверу Java, что его связь завершена?Я пытался добавить
echo -en "\004" 1>&3
в мой скрипт Bash, но это не помогло.