0

アプリケーションの1つをJava6からJava7にアップグレードしようとすると、興味深い問題が発生しました。これは単純なJavaソケットプログラムです。COMソケットにコマンドを送信し、応答を受信します。Java 6環境では完全に機能しますが、Java 7環境で同じコードを実行しようとすると、ソケットはInputStreamで何も受け取らないように見えます。

接続しているCOMソケットがコマンドを受信し、応答を送信していることを確認できます。これは、ファイアウォールが無効になっている両方の場合でまったく同じマシンで実行され、まったく同じコードが両方の時間で実行されます。

Java 7で何か変更がありましたか、それとももっと深い欠陥がありますか、それとも単にJavaのバグですか?

これは、コードを少し削除したバージョンです。

public static void main(String[] arguments) throws Exception {
  InetAddress server = InetAddress.getByName(serverAddress);
  Socket sock = SSLSocketFactory.getDefault().createSocket(server.getHostAddress(), port);
  InputStream in = sock.getInputStream();
  OutputStream out = sock.getOutputStream();
  out.write(command.getBytes()); //Is valid command
  String token = "";
  responseReader: while (true) {
    try {
      Thread.sleep(1);
    }
    catch (InterruptedException exception) {}
    byte[] d = new byte[in.available()];
    int avail = in.read(d);
    for (int i = 0; i < avail; i++) {
      if (d[i] == fieldSeperator) {
        token = "";
      }
      else if (d[i] == commandSeperator) {
        break responseReader;
      }
      else {
        token += (char) d[i];
      }
    }
  }
}

私は考えられる限り多くのことを試みましたが、ほとんどの場合、それは問題ではないことを知っています。ストリームの読み取り、SSLSocketへのキャスト、さまざまな呼び出しのさまざまな方法を使用して、スリープを追加します。

4

1 に答える 1

1

コードが間違っています。そのようなavailable()を使用するべきではありません。使用可能なデータがない場合は、長さゼロのバッファーを割り当て、長さゼロの読み取りを実行します。これにより、ブロックせずにゼロに戻ります。バッファサイズには8192のような定数を使用し、ループの外側にバッファを割り当てます。そして、sleep()も取り除きます。

available()の正しい使用法はほとんどありませんが、これはその1つではありません。

また、available()はSSLSocketに対して常にゼロを返し、Java1.3と個別のJSSEダウンロードに戻って常にゼロを返すことに注意してください。そのため、同じコードがJava6で機能したことを受け入れることができません。

于 2013-01-14T03:49:37.350 に答える