2

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とネットワークおよび/またはセキュリティファイアウォールの設定に関する問題を調査しています。繰り返しになりますが、どんな助けでもありがたいです。

4

1 に答える 1

0

メイこれは他の誰かを助けるでしょう。

隔離されたネットワークで実行されている場合、この問題は目立たないものになりました。すべての作業(シミュレーター、出力ストリーム、bonjourの無効化など)の後、解決策は、MicrosoftWindowsXPボックスでhostsファイルを編集することでした。

WINSまたはDNSサーバーを探す時間がなかったので、これはうまくいったと思います。厄介なのは、同じネットワーク上のMacまたはLinuxボックスで、IPアドレスをアドレス指定すると、タイムアウトの原因となるDNS呼び出しが自動的に排除されることです。ファイルを編集すると、奇妙な遅延が完全に削除されました。マシンに再びアクセスできるようになると、編集内容についてより具体的になります。

この問題を引き起こしたデバッグは、応答に長い時間がかかったいくつかのnetbios要求に気づいたことでした。彼らがこれを見たとき、私はそこにいませんでした。私の理解では、彼らはmac osマシンでパケットスニファを実行し、これらの要求を確認しました。彼らがWindowsマシンのhostsファイルを編集すると、問題は解決しました(netbiosブロードキャストなしでMacを見つけることができました)。

「パケットスニッフィングの結果、GUIからAgilentにクエリを実行するときに発生した遅延は、WINSサービスを介してAgilent[モーターコントローラー]を探すことについて[WindowsXPマシン]が失敗したことが原因であると判断しました。何が起こっているのかを完全に理解しているとは言えませんが、NetBIOSサービスをオフにすると遅延がなくなることを確認しました。

Windowsファイル共有がNetBIOSサービスに依存しているように見えることを除いて、これはすべて良いことです。したがって、それなしでは[WindowsXPマシン]上のディスクにアクセスできません。

そのため、ホストファイルに2行追加しました。」

それは私の同僚が私に送ったものです。つまり、Javaコードから2システム離れていました...WindowsXPボックスのLabViewアプリに対応しました。LabViewアプリ用のシミュレータを作成しました。しかし、ネットワークの問題は、LabViewアプリと別の機器の間にありました。したがって、彼の解決策は、Windows \ System32 \ Drivers \ etc \ hostsに2行を配置して、Windows側のMacとAgilentを解決することでした。これにより、ネットワーク遅延がなくなりました。

于 2014-05-05T21:09:46.833 に答える