前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >传统的BIO

传统的BIO

作者头像
田维常
发布2019-10-11 12:02:42
5500
发布2019-10-11 12:02:42
举报
文章被收录于专栏:Java后端技术栈cwnait

传统BIO

网络编程的基本模型是C/S模型(client/server),即两个进程间的通信。

服务端提供IP地址和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。

传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。

简单的描述一下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理没处理完成后,通过输出流返回应答给客户端,线程销毁。请求响应模式,请求与响应比例=1:1 请求----响应

传统BIO通信模型图:

该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,Java中的线程也是比较宝贵的系统资源,线程数量快速膨胀后,系统的性能将急剧下降,随着访问量的继续增大,系统最终就会资源耗尽,然后就是面临系统挂掉

demo案例

服务端代码

代码语言:javascript
复制
public class BIOServer {
    private static final int DEFAULT_PORT = 8081;
    public static void main(String[] args) {
        serverStart(DEFAULT_PORT);
    }

    public  static void serverStart(int port) {
        ServerSocket server = null;
        BufferedReader bf = null;
        PrintWriter pw = null;
        try {
            //创建服务端
            server = new ServerSocket(port);
            System.out.println("启动服务端");
            //从accept中获取客户端Socket
            Socket socket = server.accept();
            if (socket != null) {
                bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                System.out.println("接收到客户端发来的信息:" + bf.readLine());
                pw = new PrintWriter(socket.getOutputStream(), true);
                pw.println("服务端返回数据 server data");
            }
        } catch (IOException e) {
            System.out.println("服务端启动失败");
            e.printStackTrace();
        } finally {
            //关闭相关
            if (bf != null) {
                try {
                    bf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (pw != null) {
                pw.close();
            }

            if (server != null) {
                try {
                    server.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

客户端代码

代码语言:javascript
复制
public class BIOClient {
    private static final String DEFAULT_HOST = "127.0.0.1";
    private static final int DEFAULT_PORT = 8081;

    public static void main(String[] args) {
        send(DEFAULT_HOST, DEFAULT_PORT);
    }
    public static void send(String url, int port) {
        BufferedReader br = null;
        PrintWriter pw = null;
        Socket socket = null;
        try {
            //创建socket连接服务端
            socket = new Socket(url, port);
            System.out.println("启动客户端");
            //获取服务端向Socket中写入的流
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //通过PrintWriter类向socket中输入流
            pw = new PrintWriter(socket.getOutputStream(), true);
            pw.println("客户端请求数据:client data");
            System.out.println("接收到服务端返回数据:" + br.readLine());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //清理工作
            if (pw != null) {
                pw.close();
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {

                    e.printStackTrace();
                }
            }
        }
    }
}

启动服务端

客户端启动

相应服务端收到请求

好了,传统入门级BIO就这样了,期待升级版BIO。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • demo案例
相关产品与服务
弹性伸缩
弹性伸缩(Auto Scaling,AS)为您提供高效管理计算资源的策略。您可设定时间周期性地执行管理策略或创建实时监控策略,来管理 CVM 实例数量,并完成对实例的环境部署,保证业务平稳顺利运行。在需求高峰时,弹性伸缩自动增加 CVM 实例数量,以保证性能不受影响;当需求较低时,则会减少 CVM 实例数量以降低成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档