大话netty系列之--BIO

大话netty系列之--BIO

学渣与学霸

  大明与老王是大学同学,大明是典型的三好学生,学习优秀,生活自律,并且是学生会一员,在班级人缘也好;

而老王每天游离在课堂与社会之间,与同学们见面的次数很少,平常不是网吧就是和他们的一帮朋友出去花天酒地!

==============================分割线========================================

  话说,转眼间已经毕业四年了,同学们举行了一次大学同学聚会,再一次回到了母校,晚上吃饭吃的很high,每个人变化都特别大,大明毕业后进了一家国企,但是厌倦了那种每天平淡的生活,出来自己创业;而老王则是待在了一家小私企,郁郁不得志,安心的做了一个业务员。

  大明:老王,你变化好大啊

  老王:是啊,没想到你竟然在大国企辞职了,现在做什么生意啊

  大明:哪算的上生意啊,就是平时买点东北特产,到南方再去销售,混口饭吃呗。。

  老王:那巧了,我在东北这好多熟人,我可以找到便宜又好的货源啊,我帮你联系。

  大明:那咱俩合作搞一个一条龙吧,你负责在东北买货源,发给我,我负责收货后在南方销售;敲定之后,他俩雇了个人专门负责在中间送货

=================================分割线==========================================

我们用程序来演示下两个人的合作之路。我们把老王当做客户端,负责收集东北特产,大明当做服务端,负责接收特产,小美作为中间人,负责物流运送。

1.服务端--大明,负责接收老王的特产

/**
 * 大明,负责接收老王发过来的特产
 *
 * @author wangmj
 * @since 2018/11/18
 */
public class BioServer {
    public static void main(String[] args) {

        int port = 8761;
        ServerSocket serverSocket = null;
        try {
            //创建大明类,负责接收老王的特产
            serverSocket = new ServerSocket(port);
            System.out.println("大明类成功创建");
            Socket socket = null;
            while (true) {
                socket = serverSocket.accept();
                //将具体任务派发给小美
                new Thread(new BioServerHandler(socket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.小美--负责帮大明接收货物并发送物流

/**
 * 小美 负责中间物流配送处理
 *
 * @author wangmj
 * @since 2018/11/18
 */
public class BioServerHandler implements Runnable {

    private Socket socket;

    public BioServerHandler(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            //从大明收到的特产
            String messageFromDM = null;
            while (true) {
                messageFromDM = in.readLine();
                if (messageFromDM == null) {
                    break;
                }
                System.out.println("收到老王的特产=" + messageFromDM);
                out.println("老铁,已收到特产,接收时间:" + new Date());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

 3.老王--负责发送东北特产

/**
 * 老王,负责购买特产,发送给大明
 *
 * @author wangmj
 * @since 2018/11/18
 */
public class BioClient {
    public static void main(String[] args) {
        int port = 8761;
        Socket socket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            //创建客户端soket--老王
            socket = new Socket("127.0.0.1", port);
            //获取输出流,向服务器发送消息
            OutputStream os = socket.getOutputStream();
            out = new PrintWriter(os, true);
            out.println("今天给你发送东北特产100斤,发送时间:" + new Date());
            System.out.println("老王的东北特产成功送出");
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //收到服务端的响应
            String resp = in.readLine();
            System.out.println("收到大明的反馈=" + resp);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
            try {
                if (in != null) {
                    in.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

三个人物都已创建完毕,下面我们一次启动大明与老王类,看下运行结果:

老王:

大明:

原理分析:

我们知道BIO是阻塞IO,读与写都会发生阻塞,一旦创建连接,就不能接收其他的连接请求,直到释放连接后才去处理下一个连接请求,这样会导致效率大大降低;我们分析下刚才创建的模型图

我们分析下这样有什么坏处呢?

1.一应一答阻塞读写会很影响效率

2.每一个连接都会创建一个线程去阻塞连接,当连接数量很大时会创建大量线程,但是由于阻塞特性,效率不一定提高

     那么我们如何改进这个模式呢,当老王和大明的业务量越来越多,就会造成两个人忙得不可开交,并且为了解决这个问题,就会为每次配送都雇佣一个人,导致成本急剧增加,最终资源耗尽,生意失败。下一小节我们将试着改进下这种BIO模式

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty-WebSocket-Spring-Boot-Starter是一个用于将Websocket集成到Spring Boot应用程序中的库。它使用Netty作为底层框架,提供了一种快速和可靠的方式来处理异步通信。 这个库提供了一种简单的方法来创建Websocket端点,只需要使用注释和POJO类即可。在这些端点上可以添加动态的事件处理程序,以处理连接、断开连接和消息事件等。 此外,Netty-WebSocket-Spring-Boot-Starter还包括了一些安全性的特性,如基于令牌的授权和XSS保护,可以帮助您保持您的Websocket应用程序安全。 总的来说,Netty-WebSocket-Spring-Boot-Starter提供了一种快速和易于使用的方式来构建Websocket应用程序,使得它成为应用程序开发人员的有用工具。 ### 回答2: netty-websocket-spring-boot-starter 是一个开源的 Java Web 开发工具包,主要基于 Netty 框架实现了 WebSocket 协议的支持,同时集成了 Spring Boot 框架,使得开发者可以更加方便地搭建 WebSocket 服务器。 该工具包提供了 WebSocketServer 配置类,通过在 Spring Boot 的启动配置类中调用 WebSocketServer 配置类,即可启动 WebSocket 服务器。同时,该工具包还提供了多种配置参数,如端口号、URI 路径、SSL 配置、认证配置等等,可以根据业务需求进行自定义配置。 此外,该工具包还提供了一些可扩展的接口和抽象类,如 WebSocketHandler、ChannelHandlerAdapter 等,可以通过继承和实现这些接口和抽象类来实现业务逻辑的处理和拓展。 总的来说,netty-websocket-spring-boot-starter 提供了一个高效、简单、易用的 WebSocket 服务器开发框架,可以减少开发者的开发成本和工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值