nio入门之bio(代码片段)

junjiang3 junjiang3     2023-02-10     168

关键词:

传统BIO编程

网络编程的基本模型是Client-Server模型,也就是两个进程之间相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的端口发起连接请求,通过三次握手建立连接,如果连接成功,双方就可以通过网络套接字(Socket)进行通信。

在传统的BIO编程中,ServerSocket负责绑定IP地址,启动端口监听,Socket负责发起连接请求,连接成功之后,双方通过输入和输出流进行同步阻塞通信。

下面通过TimeServer的一个例子,回顾和熟悉BIO编程

BIO通信模型图

技术分享图片
可以看到再改模型中,有一个Acceptor线程负责监听客户端的连接,并为每个请求创建一个新的线程进行处理。

我们可以发现该模型最大问题就是缺乏弹性伸缩能力,服务端和客户端线程个数是1比1的关系。

BIO的TimeServer

package nio.bio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by jj on 2018/12/23.
 */
public class TimeServer 

    public static void main(String[] args) throws IOException 
        int port  = 8080;
        if (args != null && args.length >0)
            try
                port = Integer.parseInt(args[0]);
            catch (NumberFormatException e)

            
        

        ServerSocket server = null;

        try
            server = new ServerSocket(port);
            Socket socket = null;
            while (true)
                socket = server.accept();
                new Thread(new TimeServerHandler(socket)).start();
            
        finally 
            if (server!= null)
                server.close();
                server = null;
            
        
    

如果没有客户端请求,则阻塞在server.accept操作上,如果有,则创建一个TimeServerHandler的Runnable线程,处理客户端的Socket链路

下面,我们看一下TimeServerHandler

public class TimeServerHandler implements Runnable

    private Socket socket;

    public TimeServerHandler(Socket socket) 
        this.socket = socket;
    


    public void run() 
        BufferedReader in = null;
        PrintWriter out = null;
        try
            in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            out = new PrintWriter(this.socket.getOutputStream(),true);
            String curentTime = null;
            String body = null;
            while (true)
                body = in.readLine();
                if (body == null)
                    break;
                System.out.println("the time server receive order:" + body);
                curentTime = "QUERY TIME ORDER".equalsIgnoreCase(body)?new Date(
                        System.currentTimeMillis()
                ).toString():"BAD ORDER";
                out.println(curentTime);
            
         catch (Exception e) 
            if (in != null)
                try 
                    in.close();
                 catch (IOException e1) 
                    e1.printStackTrace();
                
            
            if (out != null)
                out.close();
                out = null;
            
            if (this.socket !=null)
                try 
                    this.socket.close();
                 catch (IOException e1) 
                    e1.printStackTrace();
                
                this.socket = null;
            
        
    

可以看到run中的功能为读取客户端请求,并通过PrintWriter返回给客户端相应。

下面我们看一下客户端的代码

public class TimeClient 

    public static void main(String[] args) throws IOException 
        int port = 8080;
        if (args != null && args.length > 0) 
            try 
                port = Integer.parseInt(args[0]);
             catch (NumberFormatException e) 

            
        
        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;
        try
            socket = new Socket("127.0.0.1",port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(),true);
            out.println("QUERY TIME ORDER");
            
            String resp = in.readLine();
            System.out.print(resp);

        finally 
            if (out != null)
                out.close();
                out = null;
            
            if (in != null)
                in.close();
                in = null;
            
            if (socket != null)
                socket.close();
                socket = null;
            
        
    

bio,nio,aio详解(代码片段)

Java中的IO,BIO,NIO,AIO详解IOBIO,NIO和AIO的关系BIO:java.io包.基于流模型实现,使用同步,阻塞方式.即:读输入流或写输出流时,在读或写动作完成之前,读(写)线程一直阻塞.性能差.NIO:java.nio包.可以构建多路复用,同步非阻塞的IO操作.AIO:Java1.7... 查看详情

java之nio编程(代码片段)

NIO介绍前面介绍了BIO为阻塞IO,其阻塞表现在两个方面:服务端等待客户端连接时的阻塞以及连接后没有发生数据传输时的阻塞。NIO是非阻塞IO,那么NIO是如何非阻塞的呢?带着这个疑问,开始研究NIO。NIO有三大组件:Selector选... 查看详情

nio简介(代码片段)

上文我们描述了五中IO类型。第一种同步阻塞模型我们我们称之为BIO(BlockingIO),  第三种IO复用模型我们称之为NIO(NonblockingIO)。     上图我们可以很容易的发现BIO会为每个socket请求创建一个线程,而NIO可以通... 查看详情

nio入门之缓冲区buffer(代码片段)

缓存区Buffer是数据容器ByteBuffer可以存储除了boolean以外的其他7种Java基本数据类型,如getInt、putIntBuffer是抽象类,它有除了Boolean以外的其他7种Java基本数据类型子类,如IntBuffer缓存区的初始化⑴静态方法allocate:初始化一个指定容... 查看详情

深入理解nio(代码片段)

...如果你是复习还好,应该不难理解这篇,但如果你真的是入门而且不常阅读这种文字教程可能会看不懂,我的锅,别担心,建议找点简单的视频教程什么的先看看)第二个部分为Tomcat中对NIO的应用(待更新)(本篇虽然讲Tomcat源... 查看详情

阿里面试题bio和nio数量问题附答案和代码(代码片段)

...使有10个连接,对于NIO来说,开启1个线程就够了。二、BIO代码实 查看详情

tomcatconnector的bio与nio模式的比较及区别(代码片段)

详细介绍了Tomcat的Connector组件的BIO和NIO模式以及工作流程。上一篇文章:Tomcat的核心组件以及server.xml配置全解【一万字】中,我们简单介绍了Connector组件的几种模式,现在我们比较详细的介绍Connector组件的BIO和NIO模... 查看详情

javaio框架之bionioaio(代码片段)

...景分析三、BIO(同步阻塞)1、简要流程2、服务端代码案例3、问题分析四、NIO(同步非阻塞ÿ 查看详情

javaio框架之bionioaio(代码片段)

...景分析三、BIO(同步阻塞)1、简要流程2、服务端代码案例3、问题分析四、NIO(同步非阻塞ÿ 查看详情

即时通讯开发之netty入门长文:基本介绍环境搭建

在了解Netty之前,我们非常有必要简要了解一下Java网络编程模型的基本常识,具体说也就是BIO、NIO和AIO这3个技术概念。BIO、NIO和AIO这三个概念分别对应三种通讯模型:阻塞、非阻塞、非阻塞异步,具体这里就不详... 查看详情

bionioaio学习笔记(代码片段)

BIONIOAIO1.同步阻塞的BIO1.1BIO介绍1.2BIO通信案例2.同步非阻塞的NIO2.1NIO的介绍2.2NIO核心一Buffer缓冲区2.3NIO核心二Channel管道2.4NIO核心三Selector选择器2.5NIO非阻塞式网络开发流程2.6NIO非阻塞式网络通信案例2.7BIO开发群聊系统3.异步非阻塞... 查看详情

netty之io模型(代码片段)

目录前言一、BIO二、NIO三、IO多路复用代码select/pollepoll前言所有的IO的前戏都是这三部曲1、newsocket()2、bind端口3、监听端口一、BIOpackagenetty.bio;​importjava.io.InputStream;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importj 查看详情

netty之io模型(代码片段)

目录前言一、BIO二、NIO三、IO多路复用代码select/pollepoll前言所有的IO的前戏都是这三部曲1、newsocket()2、bind端口3、监听端口一、BIOpackagenetty.bio;​importjava.io.InputStream;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importj 查看详情

bio与nio的几种实现方式(代码片段)

在socket通讯层面,BIO就是阻塞io,也就是说,在socket等待连接事件或者读写事件的发生的过程中,当前线程会一直处于阻塞状态,不能做其他事情;1、biopublicstaticvoidmain(String[]args)throwsIOException//bio阻塞ioÿ... 查看详情

bio与nio的几种实现方式(代码片段)

在socket通讯层面,BIO就是阻塞io,也就是说,在socket等待连接事件或者读写事件的发生的过程中,当前线程会一直处于阻塞状态,不能做其他事情;1、biopublicstaticvoidmain(String[]args)throwsIOException//bio阻塞ioÿ... 查看详情

杂谈:聊一聊nio(代码片段)

一.前言NIO是老生常谈了,由于最近准备开Netty的新坑了,不再局限于使用,初期先把前置的知识点回顾一下二.NIO的概念2.1NIO是什么?NIO可以从2个维度说,它既可以是一种设计模型,也可以说是Java中的一个包(NIO包是在java1.4中引入的).IO是... 查看详情

图灵学院15极致优化-高性能网络编程之bio与nio区别

... 数据传输1)网络传输  TCP、UDP2)通信模型  BIO、NIO、AIO  数据处理3)应用协议  HTTP、RMI、WEBSERVICE、Redis、JMS4)序列化协议  JSON、javaobject、Hession5)业务处理  servlet 二、BIO、NIO性能上的差异在同样的请求... 查看详情

终于搞懂bio,nio,aio了(代码片段)

前言I/O,通常指数据在内部存储器(内存)和外部存储器(磁盘)之间的输入和输出。在Java中提供了一些API,可以供开发者来读写外部数据或文件,称这些API为JavaIO,随着Java的发展,目前有三... 查看详情