我这里是做socket数据采集处理,想请教一下,我这个采集的方法应该怎么写(同步io)如图,我这里一个线程监听一个端口,一个端口下有3种设备(采集时间不同,通过runnable+ScheduledExecutorService实现循环采集),然后都走一个方法去做io处理接收数据。现在发现每次的采集间隔会有偏差。我觉得应该是如第一张图所示。同一socket下的设备采集是应该互斥的,但是每个socket线程应该是不互斥的
我在想是不是我写的io方法有问题,大佬们请给点建议,谢谢

解决方案 »

  1.   

    Java 网络编程 之 TCP http://www.verejava.com/?id=16994896966324
      

  2.   

    首先 tcp连接  同一个端口下是可以有N多个通道用来连接client   每一个通道都是一个单独的io通道读写操作都可以同步进行 io是线程安全的 不需要设置同步锁多个设备发送数据  是没办法保证数据同时到达的  只能先保存数据 然后根据对应的数据做处理数据处理可以考虑用压栈的形式来处理  也可以存入数据库 最后统一处理最后 ScheduledExecutorService 循环并不是稳定的到了固定的时间就一定执行 会根据已有的任务推迟执行时间
    该定时只能同时执行一个任务 在任务期间 另一个任务到达执行时间之后并不会执行 会等待第一个任务执行完成之后才会继续执行
      

  3.   

    我也知道这样一对一的不合适,可是他网关的ip是动态的,如果不是一个端口一个网关,我分不清是哪个网关反回来的数据一般这种东西  都是通过协议来判断的  自行定义一个应用层协议 根据协议内容来判断所属设备   例如在设备给你发的数据的前四字节为设备的ID什么的  根据这个来判断
    client没办法做协议的话  那就只能选择保持tcp连接  存储连接管道   再断开连接之前 他的ip动态改变是不影响的  但是开很多端口的话  第一端口是有限的 只能连接固定 的设备  第二  很消耗性能  
      

  4.   

    我也知道这样一对一的不合适,可是他网关的ip是动态的,如果不是一个端口一个网关,我分不清是哪个网关反回来的数据一般这种东西  都是通过协议来判断的  自行定义一个应用层协议 根据协议内容来判断所属设备   例如在设备给你发的数据的前四字节为设备的ID什么的  根据这个来判断
    client没办法做协议的话  那就只能选择保持tcp连接  存储连接管道   再断开连接之前 他的ip动态改变是不影响的  但是开很多端口的话  第一端口是有限的 只能连接固定 的设备  第二  很消耗性能  
    我们领导不愿意,我也没办法