我有个服务端,客户端已经建立连接。一般的做法是轮询inputstream判断有没有数据流入。我想要的效果,在数据流入inputstream的时候做一些处理,只要加入我自己的处理就可以,打印一个字符串也行。(像MINA一样只要session有活动就有事件触发。)http://blog.csdn.net/zapldy/article/details/5813984就是这里的图1中receive阶段插入我的事件

解决方案 »

  1.   

    也许不需要在数据流入的时候就处理吧。你直接集成Socket写个子类,然后重写getInputStream()返回你所包装过的InputStream,在执行read的时候做你想要的处理不就行了么?
      

  2.   

    read本身就是含有轮询机制的了吧,再配合上超时
      

  3.   

    一般的做法都是这样,但是这个做法已经包涵了对inputstream的轮询,已经消耗了我的资源。我的想法是类似mina的EVENT模式,当有数据流入的时候,我直接将其堆入我的buffer。而不是通过线程去轮询inputstream来判断和获取数据。这样我只要起一个线程去不断的处理buffer里的数据即可。这样在线程上数量少了,而且处理量也小了。
      

  4.   

    说的简单点,
    就是想要socket在有数据流入的时候主动通知我(当然也不是简单得将轮询做法放入SOCKET里面),而不是我在socket外部通过轮询方式来了解socket是否有数据流入。
      

  5.   

    我不知道有没有Socket关联方具有这种功能,因为据我了解,获取socket数据,都是主动去获取,而不是被动等待通知,Socket内部可能没有设计类似观察者模式的机制
      

  6.   


    你的意思就是,我的Socket服务端,不需要while去使劲获取客户端是否请求数据。 你想把这种改成 回调函数。这是不可能的吧,你的客户端和服务端是不同的程序,你必须保证有服务端监听的那共同的端口,既然是监听那肯定是一直获取是否有不同IP对着端口的请求。
      

  7.   

    http://blog.csdn.net/yjflinchong/article/details/7280213
    一个传输文件例子。 
      

  8.   


    好像你理解错了意思,不需要轮询inputstream。只是把你期望的“数据一到输入流”这个时机改为“程序一读取流”,并不需要额外轮询,没数据的时候执行读,仍然是常规的阻塞而已。当然可能你希望走事件机制,那么传统IO是不行的,你要用NIO。
      

  9.   


    额,,是你没理解我的说法,呵呵,,这种做法依然是要,不停的去READ(),这个跟轮询INPUTSTRAM区别并不是非常大。我也在找非阻塞的,请问有没有好的资料啊?,,我看了些NIO的,很多都封装太全,给我其他的一些操作带来麻烦。
      

  10.   


    恩,我就是想要给他加上Observer 模式,所以在找方法。
      

  11.   


    即便是事件机制,你还是要去read(),不会因为启动了事件机制而不需要read()。
    无论是谁,总要有人负责去读流。最后只能是封装在哪里的问题而已。