我想建立一個Java應用程序作爲服務器,接受(阻止)來自Bash腳本的查詢。 Java的部分是用nio
寫的,有一個主循環看起來像這樣:Bash和Java之間的通信與渠道:發送結束髮送
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
我可以看到該消息從猛砸發送確實到達Java部分(如果我在內部循環中添加一個System.out.println(cb);
,我可以看到這些部分),但內部循環不會終止,除非我終止Bash腳本。
我的問題其實很簡單:Bash腳本如何向Java服務器發出通信已結束的信號?我試過添加
echo -en "\004" 1>&3
在我的Bash腳本中,但沒有幫助。
再次想到,我可能會誤解渠道是如何運作的。我試圖達到的目的是讓Java認爲溝通已經結束,但可能會在稍後恢復。不知何故,我認爲這應該是一個不同於簡單關閉頻道的行爲,但這可能是錯誤的。也許我真正需要的是一個小小的協議,它說「這就是消息的結尾」。爲我澄清這一點的答案也是可以接受的。 – Philippe 2012-02-13 18:59:48