发送对象时如何避免每个套接字的超时?

时间:2018-03-23 20:35:14

标签: java sockets networking serialization

我将尝试尽可能准确地描述问题:

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

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

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

我想发送的对象是基本的,这是一个类似的例子:

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

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

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

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

非常感谢你。

2 个答案:

答案 0 :(得分:0)

发送数据throut套接字不需要繁重的cpu usae,而是使用高i / o。使用像netty这样的异步库,您可以使用少量线程获得最快的结果。同样使用更加兼容的序列化(如protocol buffer)可以减少发送数据所需的时间

答案 1 :(得分:0)

嗯,解决方案是以下列方式使用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();