請幫我弄清楚爲什麼Mac OS X Java比Windows XP Java要長5倍。socket mac os x vs windows java慢
我有一些代碼在Mac和PC上的行爲有所不同。我有一個Java GUI,可以與Windows XP上的許多「服務器」進行對話。
當我在另一臺Windows XP機器或Linux機器上運行GUI時,LabView接收消息並在1秒內響應。
當它從Mac OS X框運行時,需要5秒。我認爲我發送字符串「pot 7 \ r \ n」的時間與LabView實際收到的時間之間的暫停似乎是(從我們可以判斷的所有調試中)。
當從Windows進來時,LabView會立即看到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的版本給出:
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秒,第一個接收):
在此先感謝您的任何幫助/建議。
後續:
因爲我已經發現,如果我使用的是10.7.5的Mac OS機器在同一個Java的速度是相同的Windows XP。我現在正在研究10.8.3和網絡和/或安全防火牆設置的問題。再次,任何幫助表示讚賞。
您可能嘗試禁用nagle算法:socket.setTcpNoDelay(true) – 2013-03-19 22:01:53
感謝您的想法,但它沒有幫助。 – evernoob 2013-03-20 13:41:59
我懷疑它是PrintWriter *自動沖洗引起的問題,即使你強制flush()。您可以嘗試直接寫入流,而不是「PrintWriter」。 'socket.getOutputstream()寫((消息+ 「\ r \ n」 個)的getBytes( 「UTF-8」)。); socket.getOutputstream()。flush();' – 2013-03-20 16:00:13