Mac OSXJavaがWindowsXPJavaの5倍の時間がかかる理由を理解するのを手伝ってください。
MacとPCJavaで動作が異なるコードがいくつかあります。WindowsXPボックス上の多数の「サーバー」と通信するJavaGUIがあります。
別のWindowsXPマシンまたはLinuxマシンでGUIを実行すると、LabViewはメッセージを受信し、1秒以内に応答します。
Mac OS Xボックスから実行する場合、5秒かかります。一時停止は、文字列「pot 7 \ r \ n」を送信したと思ってから、LabViewが実際に受信するまでの間にあるようです(デバッグにわかります)。
LabViewはWindowsから来るとすぐにpot7コマンド(チェックするディスプレイがあります)を認識しますが、LabViewプログラマーによると、MacOSマシンから送信されてから5秒が経過するまでコマンドは画面に表示されません。
私はここで十分なコードを提供しようとしますので、もっと知っている人がああ言うかもしれません!
String IPaddress;
int commPort;
BufferedReader reader;
PrintWriter writer;
Socket sock;
long timeout = 8000;
..。
public synchronized void connectCommPort() {
if (commportconnected != true) {
try {
sock = new Socket();
InetSocketAddress endpoint = new InetSocketAddress(IPaddress, commPort);
sock.connect(endpoint, timeout);
sock.setSoTimeout( timeout );
reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
writer = new PrintWriter(sock.getOutputStream());
commportconnected = true;
errorstatus = false;
} catch (IOException ex) {
logwriter("LabV: WARNING - network connection to Labview command port failed."+ex.toString());
commportconnected = false;
errorstatus = true;
}
}
}
..。
public synchronized float[] readpots() {
String message = "pot 7";
connectCommPort();
if (commportconnected) {
try {
writer.print(message + "\r\n");
writer.flush();
logwriter("LabV: [sent] " + message);
shortpotvalues = potslistener();
} catch (Exception ex) {
}
disconnectCommPort();
}
potvalues[0] = shortpotvalues[0];
potvalues[1] = shortpotvalues[1];
potvalues[2] = shortpotvalues[2];
potvalues[3] = shortpotvalues[3];
potvalues[4] = shortpotvalues[4];
potvalues[5] = shortpotvalues[5];
potvalues[6] = shortpotvalues[6];
potvalues[7] = 5.0f;
return potvalues;
}
public synchronized float[] potslistener() {
String message = null;
int i = 0;
try {
//while ((message = reader.readLine()) != null && i < shortpotvalues.length) {
while (i < shortpotvalues.length) {
message = reader.readLine();
if ( message != null )
{
logwriter("LabV: [received] " + message);
if (message.contains("."))
{
shortpotvalues[i] = Float.parseFloat(message);
i++;
}
}
else
{
logwriter("LabV: received NULL unexpectedly, may not have all pots correct");
}
} // close reader-ready-while
} catch (ArrayIndexOutOfBoundsException aiofbex) {
logwriter("LabV: in potslistener() Array out of bounds! " + aiofbex.toString());
} catch (Exception ex) {
logwriter("LabV: in potslistener() got exception: " + ex.toString());
}
return shortpotvalues;
}
Mac OSX10.8の場合。java -versionを実行すると、次のようになります。
marks-Mac-mini:~ mark$ java -version
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01-447-11M4203)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01-447, mixed mode)
Windows XP(GUIがWindowsで実行され、正常に動作するときに使用されるJava)では、次のようになります。
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\gus>java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode, sharing)
最後に、PCからのログの一部を次に示します。
2013-03-19T11:45:22.000 LabV: [sent] pot 7
2013-03-19T11:45:22.921 LabV: [received] 2.310835
2013-03-19T11:45:22.921 LabV: [received] 2.447397
そしてそれに対応してMacから(送信から最初の受信までの5秒に注意してください):
2013-03-13T12:13:17.092 LabV: [sent] pot 7
2013-03-13T12:13:22.513 LabV: [received] 2.300508
2013-03-13T12:13:22.514 LabV: [received] 2.112090
ヘルプ/アドバイスを事前に感謝します。
ファローアップ:
それ以来、同じJavaで10.7.5 Mac OSマシンを使用した場合、速度はWindowsXPと同じであることがわかりました。現在、10.8.3とネットワークおよび/またはセキュリティファイアウォールの設定に関する問題を調査しています。繰り返しになりますが、どんな助けでもありがたいです。