【问题标题】:How do I avoid the timeout of each socket when sending an object?发送对象时如何避免每个套接字超时?
【发布时间】:2018-09-02 14:50:41
【问题描述】:

我会尽量准确和概括地描述问题:

我必须通过 TCP(套接字)向 254 个可能的设备“192.168.1.2-255”发送一个流,因为我需要确保信息能够顺利到达,并在尽可能短的时间内完成。

  • 如果我一次执行一行,超时时间为 200 毫秒(非常少),则该过程需要 51 秒。

  • 如果我在不同的线程中执行每一行,只需要一两秒,但会创建 254 个线程加上程序本身拥有的线程,尽管它们只持续一秒。

    李>

我要发送的对象是基本的,这将是一个类似的示例:

class Usuarios implements Serializable { 
   private int id,ip;
   private String name;

   //Constructor, Getters and Setters, etc...
}

有没有办法解决这个问题而不必在每个周期等待一分钟,或者运行超过 250 个线程?

澄清:也许形式是这样的,但是执行这么多线程似乎太多了,即使是一秒钟的周期,每10次重复一次。 我已经看过 java.NIO 库,但它没有说明如何发送序列化对象。

已经非常感谢你了。

【问题讨论】:

标签: java sockets networking serialization


【解决方案1】:

通过套接字发送数据不需要大量的 cpu 使用,而是使用高 i/o。使用 netty 之类的异步库,您可以用很少的线程获得最快的结果。此外,使用更兼容的序列化,如 protocol buffer 可以减少发送数据所需的时间

【讨论】:

    【解决方案2】:

    嗯,解决方案是通过以下方式使用 ExecutorService 和 Runnable 类:

    //10 Threads to execute the task
    ExecutorService threadpool = Executors.newFixedThreadPool(10);        
    
    Runnable task = new Runnable() {
       @Override
       public void run() {
         //Task to do with socket's
       }
    };
    threadpool.submit(task);
    threadpool.shutdown();
    

    【讨论】:

    • 将时间从 51 秒减少到 13 秒,线程数为 10,超时时间为 500 毫秒。
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2011-08-17
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多