我们都知道,BIO是同步阻塞的IO方式,当BIO服务器调用accept()和read()方法时,都有可能发生阻塞。
下面是一个简易的BIO服务器程序:

public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);while (true){Socket accept = serverSocket.accept();InputStream in = accept.getInputStream();byte[] buffer = new byte[1024];int len;while ((len = in.read(buffer))!=-1){System.out.println(new String(buffer,0,len));}System.out.println("接收完毕");in.close();accept.close();}}
}

在读取文件时,len = in.read(buffer)当到达文件末尾时就会返回-1,但是在网络编程中,不知道客户端是否发送完毕,那么到底什么时候会返回-1,什么时候会阻塞呢?

  • 首先先开一个这样的客户端
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8080);OutputStream out = socket.getOutputStream();out.write("Hello,this is Client".getBytes());out.flush();out.close();}
}

开启后,发现服务器能输出“接收完毕”,即此时返回了-1,并没有阻塞。

  • 然后我们把out.close();去掉
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8080);OutputStream out = socket.getOutputStream();out.write("Hello,this is Client".getBytes());out.flush();}
}

开启后,发现服务器依旧能输出“接收完毕”,即此时也返回了-1

  • 我们再测试下面一个客户端,让客户端程序不停止,也不关闭输出流
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8080);OutputStream out = socket.getOutputStream();out.write("Hello,this is Client".getBytes());out.flush();while (true){}}
}

这时发现服务器只接收到了数据,并没有输出“接收完毕”,即这时已经阻塞在了read方法上

  • 如果在while (true)之前先关闭out流
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8080);OutputStream out = socket.getOutputStream();out.write("Hello,this is Client".getBytes());out.flush();out.close();while (true){}}
}

这时服务器又能返回“接收完毕”了,说明此时read()又返回了-1,而没有发生阻塞。

通过以上的实验可以得出结论,socket的read()方法在所有数据读取完毕且客户端的输出流关闭时会返回-1,而如果客户端的输出流如果没有关闭则会阻塞。
而第二种情况之所以也会返回-1是因为客户端程序执行完毕后,自动回收关闭了socket的输出流。

回归实际情况,如果在服务器不限制连接时间的情况下,客户端很有可能一直保持连接状态但不发送数据(不活跃状态),因此这时服务器就会一直阻塞在read方法上,因此如果使用BIO则必须创建多个线程。

socket.read()的阻塞问题相关推荐

  1. 深入理解阻塞socket和非阻塞socket

    什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思是指,当试图对该文件描述符进行 ...

  2. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  3. Linux下Socket通信中非阻塞connect、select、recv 和 recvfrom、send和sendto大致讲解,附带非租塞connect代码、MSG_NOSIGNAL

    linux中send函数MSG_NOSIGNAL异常消息 在服务器端用ctrl+c 来结束服务器接收进程来模拟服务器宕机的情况,结束服务 socket 进程之后,服务端自然关闭进程,可是 client ...

  4. UE4 Socket多线程非阻塞通信【2】

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 紧接着第一部分,别说话,勿打断我游离的思绪我们走我们走... 二.消息结构&收发队列 先不急着往下走,先捋一捋,不知道自己要干什么地走下去是一件 ...

  5. UE4 Socket多线程非阻塞通信【1】

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 前面写了一篇有关于虚幻4加载第三方库的博客思前顾后,感觉细节还是有必要拎起来注意下. ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的 ...

  6. Socket 实现非阻塞式多线程文件传输(jpg mov 等各种格式)

    Socket 基础 非阻塞式TCP socket 实现文件传输, 实测 传输5M的jpg , 30M的 NEF(单反原图) 以及 1G以上的mov文件,均正常接收 客户端可多开,服务器多线程实现服务器 ...

  7. Socket 基础 非阻塞式TCP socket,实现文件传输jpg,mov等格式

    Socket 基础 非阻塞式TCP socket 实现文件传输, 实测 传输5M的jpg , 30M的 NEF(单反原图) 以及 1G以上的mov文件,均正常接收 客户端可多开,服务器多线程实现服务器 ...

  8. socket可能造成阻塞的函数有:connect()、accept()、读写函数、select()、poll()、gethostbyname()等

    阻塞模式 是socket的缺省方式,也是最常用的方式,即函数阻塞直到调用完毕.可参见前面的例子. 可能造成阻塞的函数有:connect().accept().读写函数.select().poll(). ...

  9. iphone开发之轻松搞定原生socket 编程,阻塞与非阻塞,收发自如

    iphone socket 开发 在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket. 这里要做一个简单 ...

  10. Socket,非阻塞,fcntl

    随笔 - 71  文章 - 61  评论 - 32 一.fcntl 用以下方法将socket设置成为非阻塞方式 int  flags = fcntl(socket,F_GETFL,0); fcntl( ...

最新文章

  1. 文本主题模型之非负矩阵分解(NMF)
  2. java好还是python好-学python好还是java好
  3. chrome表单自动填充去掉input黄色背景
  4. day18 15.自定义连接池
  5. Oracle增大redo log file的方法
  6. mysql5.7编译安装路径_MySQL_MySQL 5.5/5.6/5.7及以上版本安装包安装时如何选择安装路径,安装环境需求: 自从昨天安 - phpStudy...
  7. mysql变更AUTO_INCREMENT值
  8. P3261-[JLOI2015]城池攻占【左偏树】
  9. Linux系统瘦身裁剪 续
  10. 拼图游戏和它的AI算法
  11. python修改第三方库重写_python安装第三方库时的一些bug 镜像源修改
  12. 清北学堂模拟赛day7 错排问题
  13. tcp/ip网络协议学习
  14. 开发板ping不通Linux虚拟机的原因及解决办法
  15. 最新emoji表情代码大全_7张最新有创意好看的早安问候动画表情图片 暖心的早上好问候祝福动态图片表情大全...
  16. MMD原神动画制作(学习教程二)
  17. 阿里云轻量级应用服务器设置外网访问端口
  18. 英雄联盟英雄技能总结
  19. 2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part6
  20. Attach机制实现完全解读

热门文章

  1. 电子政务信息管理平台方案
  2. 使用Fiddler进行手机抓包
  3. OpenGauss一主一从搭建(全网最详细,最简单)
  4. 安卓系统应用程序开发!华为Android面试真题解析,内含福利
  5. 逆水寒能不能网页预约服务器,逆水寒怎么预约春暖花开服务器 春暖花开服务器预约流程...
  6. synchronized,ReentrantLock、ReentrantReadWriteLock和StampedLock
  7. Centos7.4下安装Nvidia驱动
  8. idea的pom.xml文件图标是黄色而不是蓝色
  9. DSW算法(《C++数据结构与算法》P200)
  10. 完成自己的Google测试框架