jjzjj

java - 套接字 mac os x vs windows java 慢

coder 2024-06-15 原文

请帮我弄清楚为什么 Mac OS X Java 比 Windows XP Java 花费 5 倍的时间。

我有一些代码在 Mac 和 PC Java 上表现不同。我有一个 Java GUI,它与 Windows XP 机器上的许多“服务器”对话。

当我在另一台 Windows XP 机器或 Linux 机器上运行 GUI 时,LabView 会收到消息并在 1 秒内做出响应。

当它从 Mac OS X box 运行时,需要 5 秒。暂停似乎是(根据我们可以告诉调试的)我认为我发送字符串“pot 7\r\n”和 LabView 实际接收到它的时间之间。

当来自 Windows 时,LabView 会立即看到 pot 7 命令(我们有一个显示要检查),但根据 LabView 程序员的说法,当从 Mac OS 机器发送时,该命令直到 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 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 上(当 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 机器,速度与 Windows XP 相同。我现在正在研究 10.8.3 和网络和/或安全防火墙设置的问题。再次感谢您的帮助。

最佳答案

也许这会对其他人有所帮助。

当我们在一个孤立的网络上运行时,这个问题就成了阻碍。在完成所有这些工作(模拟器、输出流、禁用 bonjour 等)之后,解决方案是编辑 Microsoft Windows XP 机器上的主机文件。

我认为这很有效,因为没有时间花在寻找 WINS 或 DNS 服务器上。令人恼火的是,在同一网络上的 mac 或 linux 机器上,寻址 IP 地址会自动消除任何导致超时的 DNS 调用。编辑文件完全消除了奇怪的延迟。当我再次访问机器时,我会更具体地说明编辑的内容。

导致我们出现此问题的调试是注意到一些 netbios 请求需要很长时间才能响应。他们看到这个的时候我不在场。我的理解是他们在 mac os 机器上运行了一个数据包嗅探器并看到了这些请求。当他们编辑 Windows 机器主机文件时,问题就消失了(它可以在没有 netbios 广播的情况下找到 mac)。

"After some packet sniffing we have determined that the delay we've been experiencing when querying the Agilent from the GUI has been due to [the Windows XP machine] flailing about looking for the Agilent [a motor controller] via the WINS service. Can't say that I completely understand what's going on, but we verified that the delay goes away when we turn the NetBIOS service off.

Which would be all good, except that windows file sharing seems to depend on the NetBIOS service, thus we can't access the disk on [the Windows XP machine] without it.

So we added two lines in the host file"

这是我同事发给我的。所以它与我的 Java 代码相距两个系统......我在 Windows XP 盒子上解决了一个 LabView 应用程序。我为 LabView 应用程序编写了一个模拟器。但网络问题出在 LabView 应用程序和另一台设备之间。所以他的解决办法是在Windows\System32\Drivers\etc\hosts里放两行解决Windows端的Mac和Agilent,网络延迟就没有了!

关于java - 套接字 mac os x vs windows java 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510696/

有关java - 套接字 mac os x vs windows java 慢的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  8. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  9. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  10. java - Ruby 相当于 Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap - 2

    Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur

随机推荐