| 1) Java BIO 就是传统的java io 编程,其相关的类和接口在 java.io |
| 2) BIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理, |
| 如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。 |
| 3) BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解 |
-
工作原理图

-
工作流程
| 1) 服务器端启动一个ServerSocket |
| 2) 客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每个客户 建立一个线程与之通讯 |
| 3) 客户端发出请求后, 先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝 |
| 4) 如果有响应,客户端线程会等待请求结束后,在继续执行 |
| 1) 使用BIO模型编写一个服务器端,监听6666端口,当有客户端连接时,就启动一个线程与之通讯。 |
| 2) 要求使用线程池机制改善,可以连接多个客户端 |
| 3) 服务器端可以接收客户端发送的数据(telnet 方式) |
| public class BIOServer { |
| public static void main(String[] args) throws Exception { |
| |
| |
| |
| |
| ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); |
| |
| ServerSocket serverSocket = new ServerSocket(6666); |
| System.out.println("服务器启动了"); |
| while (true) { |
| System.out.println("线程信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName()); |
| |
| System.out.println("等待连接...."); |
| final Socket socket = serverSocket.accept(); |
| System.out.println("连接到一个客户端"); |
| |
| |
| newCachedThreadPool.execute(new Runnable() { |
| public void run() { |
| |
| handler(socket); |
| } |
| }); |
| } |
| } |
| |
| |
| public static void handler(Socket socket) { |
| try { |
| System.out.println("正在与线程信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName()+ "通信。。"); |
| byte[] bytes = new byte[1024]; |
| |
| InputStream inputStream = socket.getInputStream(); |
| |
| while (true) { |
| System.out.println("read...."); |
| |
| int readLen = inputStream.read(bytes); |
| if (readLen != -1) { |
| System.out.println("线程" + Thread.currentThread().getId() + ":" +new String(bytes, 0, readLen)); |
| } else { |
| break; |
| } |
| } |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } finally { |
| System.out.println("关闭和client的连接"); |
| try { |
| socket.close(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| |
| } |

| |
| |
| plugins { |
| id 'application' |
| } |
| |
| apply plugin :"java" |
| ext { |
| javaMainClass ="com.ychen.netty.bio.BIOServer" |
| } |
| |
| application { |
| mainClassName = javaMainClass |
| } |
| |
| task runWithJavaExec(type: JavaExec) { |
| group ="Execution" |
| description ="Run the main class with JavaExecTask" |
| classpath = sourceSets.main.runtimeClasspath |
| main = javaMainClass |
| } |
-
执行任务

-
连接
| |
| telnet 127.0.0.1 6666 |
| |
| |
| |
| |
| send [msg] |

- 查看控制台

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?