アプリケーションの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へのキャスト、さまざまな呼び出しのさまざまな方法を使用して、スリープを追加します。