首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:正确的网络IO处理?

Java:正确的网络IO处理?
EN

Stack Overflow用户
提问于 2010-03-01 11:33:22
回答 6查看 988关注 0票数 0

我遇到的问题是,当我使用InputStream读取字节时,它会阻塞,直到连接完成。例如:

代码语言:javascript
复制
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[20000];
        while (is.read(buffer) != -1) {
            System.out.println("reading");
        }
        System.out.println("socket read");

直到实际收到FYN数据包,"socket read“才会打印出来,从而关闭连接。在不阻塞和等待连接断开的情况下接收所有字节的正确方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-03-01 14:47:29

试试这个:

代码语言:javascript
复制
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[20000];
        int bytesRead;
        do {
            System.out.println("reading");
            bytesRead = is.read(buffer);
        }
        while (is.available() > 0 && bytesRead != -1);
        System.out.println("socket read");

更多信息:https://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html#available()

票数 1
EN

Stack Overflow用户

发布于 2010-03-01 11:36:24

看看支持non-blocking IOjava.nio吧。

票数 2
EN

Stack Overflow用户

发布于 2010-03-01 12:51:03

使用传统套接字的要点是,通常您确实希望它们阻塞:当逻辑上不希望程序阻塞时,您所做的是将读/写代码放在另一个线程中,以便单独的读/写线程阻塞,而不是整个程序。

如果做不到这一点,您可以使用available()方法在读取之前查看是否确实有可用的输入。但是,您需要注意不要通过不断调用available()而陷入消耗CPU的循环。

编辑:如果问题是你很乐意阻塞,直到字节到达,但直到连接断开(这就是发生的情况),那么你需要让另一端的客户端在发送字节后对其输出流调用flush()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2353743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档