请帮我弄清楚为什么Mac OS X Java比Windows XP Java长5倍。
我有一些代码在Mac和PC Java上表现不同。我有一个Java GUI,它与Windows XP盒子上的许多“服务器”进行通信。
当我在另一台Windows XP计算机或Linux计算机上运行GUI时,LabView会收到消息并在1秒内响应。
当它从Mac OS X框运行时,需要5秒钟。在我发送字符串“pot 7 \ r \ n”的时间和实际上由LabView接收的时间之间,暂停似乎(从我们可以告诉调试的所有时间)。
LabView在来自Windows时立即看到了pot 7命令(我们有一个要检查的显示)但是根据LabView程序员的说法,直到从Mac OS机器发送的5秒钟后,命令才会显示在屏幕上
我会尝试在这里提供足够的代码,知道更多的人可能会说aha!
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 OS X 10.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(在Windows上运行GUI并且工作正常时使用的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机器,速度与Windows XP相同。我现在正在研究10.8.3以及网络和/或安全防火墙设置的问题。再次,任何帮助表示赞赏。
答案 0 :(得分:0)
Maye这将有助于其他人。
什么时候在一个孤立的网络上运行,这个问题成为一个显示阻止。完成所有工作(模拟器,输出流,禁用bonjour等)后,解决方案是编辑Microsoft Windows XP框上的hosts文件。
我认为这很有效,因为没有时间寻找WINS或DNS服务器。令人讨厌的是,在同一网络上的mac或linux机器上,寻址IP地址会自动消除导致超时的任何DNS调用。编辑文件完全消除了奇怪的延迟。当我再次访问该机器时,我将更具体地了解编辑内容。
导致我们遇到此问题的调试是注意到一些需要很长时间才能响应的netbios请求。当他们看到这个时,我不在那里。我的理解是他们在mac os机器上运行了一个数据包嗅探器并看到了这些请求。当他们编辑Windows机器主机文件时,问题就消失了(它可以找到没有netbios广播的mac)。
“经过一些数据包嗅探,我们已经确定了我们的延迟 从GUI查询安捷伦时遇到的问题 到[Windows XP机器]喋喋不休寻找安捷伦[a 电机控制器]通过WINS服务。不能说我完全 了解发生了什么,但我们确认延迟消失了 当我们关闭NetBIOS服务时。
哪个好,除了 Windows文件共享似乎依赖于NetBIOS服务,因此 如果没有它,我们无法访问[Windows XP机器]上的磁盘。
所以我们在主机文件“
中添加了两行
这是我同事送给我的。所以它远离我的java代码两个系统...我在Windows XP盒子上发了一个LabView应用程序。我为LabView应用程序编写了一个模拟器。但是网络问题出现在LabView应用程序和另一台设备之间。所以他的解决方案是在Windows \ System32 \ Drivers \ etc \ hosts中放两行来解析Windows和Mac上的安捷伦,网络延迟消失了!