V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
teliang
V2EX  ›  Java

小白不懂就问, Java InputStream 如何在接收数据时收到事件通知

  •  
  •   teliang · 2021-08-27 18:33:15 +08:00 · 1614 次点击
    这是一个创建于 944 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大佬,现在有个场景是这样的:
    我本地建立一个 Socket 连接到服务器,OutputStream.write 和 flush 给服务器发送数据,等待服务响应然后读取数据。

    问题:
    我 flush 后直接 InputStream.available()返回 0,需要 sleep 零点几秒才能拿到数据,并发请求的时候都 sleep 感觉不太好

    请问:
    InputStream 有没有事件通知呢,比如服务器返回数据后有个事件通知,我用线程池处理数据

    跪求各位大佬指教
    第 1 条附言  ·  2021-08-27 22:18:12 +08:00
    5 楼说的对,我直接 read 就行,是我傻了,nio 我还不太会用,等我看看书再试试
    9 条回复    2021-08-28 14:07:36 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2021-08-27 18:39:10 +08:00
    你需要的可能是 nio,
    Ariver
        2
    Ariver  
       2021-08-27 18:45:58 +08:00 via iPhone
    2021 年了,用 netty 写吧。
    如果不用的话就是写一个死循环
    AoEiuV020
        3
    AoEiuV020  
       2021-08-27 18:46:23 +08:00 via Android   ❤️ 1
    不过你都提到线程池了,bio 正常做法就是单独一个线程循环读数据,读到了再处理,没读到就一直等着,这也不需要什么通知,
    teliang
        4
    teliang  
    OP
       2021-08-27 19:18:10 +08:00
    @AoEiuV020 有道理,我试试 nio
    kaneg
        5
    kaneg  
       2021-08-27 20:07:06 +08:00 via iPhone   ❤️ 1
    直接调 read ()方法啊,它会自己阻塞直到有数据才返回。
    darkengine
        6
    darkengine  
       2021-08-27 21:25:28 +08:00
    用 netty 吧
    lululau
        7
    lululau  
       2021-08-27 21:47:29 +08:00
    nio 是要你去 polling 的吧,楼主要的应该是 aio 吧
    Cbdy
        8
    Cbdy  
       2021-08-27 22:10:01 +08:00   ❤️ 1
    这点小需求有必要上框架吗?

    您点的单线程读,多线程处理
    https://gist.github.com/cbdyzj/5a9612a00db7fdcf1b9fc314b3c58c70
    gBurnX
        9
    gBurnX  
       2021-08-28 14:07:36 +08:00
    什么年代了还自己写 socket...

    直接 pb + gprc 一步到位不好嘛?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3218 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:35 · PVG 19:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.