3

Unixツールbcのように、入力を受け入れて出力を提供するアプリケーションと通信するダーツサーバーアプリケーションを作成しようとしています。

bc の出力を読み取ることはできますが、コマンドを bc に送信することはできません。これが私のコードです:

#import('dart:io');

void main() {
  var p = Process.start('bc', ["-i"]);
  var stdoutStream = new StringInputStream(p.stdout);

  stdoutStream.onLine = () => print(stdoutStream.readLine());
  p.stdin.writeString("quit\n");

  p.onExit = (exitCode) {
    print('exit code: $exitCode');
    p.close();
  };
}

実行すると、次のエラーが表示されます。

Unhandled exception:
SocketIOException: writeList failed - invalid socket handle
 0. Function: '_Socket@14117cc4.writeList' url: 'dart:io' line:4808 col:48
 1. Function: '_SocketOutputStream@14117cc4._write@14117cc4' url: 'dart:io' line:4993 col:70
 2. Function: '_SocketOutputStream@14117cc4.write' url: 'dart:io' line:4969 col:29
 3. Function: '_BaseOutputStream@14117cc4.writeString' url: 'dart:io' line:5197 col:3
 4. Function: '::main' url: 'file:///var/www/html/example.dart' line:8 col:22

「quit\n」と書き込もうとしている行をコメントアウトすると、実行され、bc の出力が表示されます。

では、プログラムから bc のようなサーバー上のアプリケーションにコマンドを送信するにはどうすればよいでしょうか?

4

1 に答える 1

3

問題は、プロセスが適切に開始される前に標準入力に書き込んでいることです。試す:

#import('dart:io');

void main() {
  var p = Process.start('bc', ["-i"]);
  var stdoutStream = new StringInputStream(p.stdout);

  stdoutStream.onLine = () => print(stdoutStream.readLine());
  p.onStart = () => p.stdin.writeString("1+1\nquit\n");

  p.onExit = (exitCode) {
    print('exit code: $exitCode');
    p.close();
  };
}
于 2012-08-21T15:55:10.693 に答える