V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
teliang
V2EX  ›  Java

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

  •  
  •   teliang · Aug 27, 2021 · 2217 views
    This topic created in 1708 days ago, the information mentioned may be changed or developed.
    各位大佬,现在有个场景是这样的:
    我本地建立一个 Socket 连接到服务器,OutputStream.write 和 flush 给服务器发送数据,等待服务响应然后读取数据。

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

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

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

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

    直接 pb + gprc 一步到位不好嘛?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2509 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 12:20 · PVG 20:20 · LAX 05:20 · JFK 08:20
    ♥ Do have faith in what you're doing.