首页 > 编程语言 >Java网络IO-BIO

Java网络IO-BIO

时间:2023-12-20 18:35:27浏览次数:26  
标签:BIO Java 请求 线程 IO 数据 连接 客户端

Java BIO 就是传统的 Java I/O 编程
BIO(BlockingI/O):同步阻塞,服务器实现:一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。
单线程情况下,只有一个线程可以处理客户端请求,也就是同时只能连接一个客户端。

优化点:可以通过线程池机制改善,实现多个客户端连接

BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,程序简单易理解。

示例:使用 Blocking IO 模型实现一个单线程网络服务器

package com.fixbugs.bio;

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

/**
 * Blocking Server
 *
 * @author fix-bugs
 * @date 2023/12/20 17:06
 */
public class BlockingServer {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(1234);
        while (true) {
            System.out.println("等待客户端连接...");
            Socket clientSocket = server.accept();
            System.out.println("新客户端已连接。当前线程ID:" + Thread.currentThread().getId() + ",线程名称:" + Thread.currentThread().getName());
            byte[] bytes = new byte[1024];
            try(InputStream inputStream = clientSocket.getInputStream();) {
                while (true) {
                    int read = inputStream.read(bytes);
                    if (read != -1) {
                        System.out.println("客户端请求数据:" + new String(bytes, 0, read));
                    } else {
                        break;
                    }
                }
            } finally {
                System.out.println("关闭客户端。当前线程ID:" + Thread.currentThread().getId() + ",线程名称:" + Thread.currentThread().getName());
                clientSocket.close();
            }
        }
    }
}

输出结果:

等待客户端连接...
新客户端已连接。当前线程ID:1,线程名称:main
客户端请求数据:a
客户端请求数据:b
客户端请求数据:c
客户端请求数据:d
客户端请求数据:d
客户端请求数据:s
客户端请求数据:s
客户端请求数据:1
客户端请求数据:2
关闭客户端。当前线程ID:1,线程名称:main
等待客户端连接...

image

问题分析:
每个请求都需要创建独立的线程,与对应的客户端进行业务处理,当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大。
连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在 accept 操作上,造成线程资源浪费。

标签:BIO,Java,请求,线程,IO,数据,连接,客户端
From: https://www.cnblogs.com/yangzhenlong/p/17917202.html

相关文章

  • VisualStudio2019创建Code Snippet
    CodeSnippet是什么CodeSnippet,与其称其为代码片段(CodeBlock),将它翻译成代码模板(CodeTemplate)可能更合适一些。任何一段代码都可以叫做代码片段,我们这里要讲的不是这种随性的东西,而是一种快速生成代码的快捷方式,通过它可以有效地提高我们的编程效率。举个例子,假如你在C#......
  • beanshell导入java文件
    beanshell导入java文件beanshell可以读取class格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用   beanshell可以读取java格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用  ......
  • iOS项目中加入flutter
    新建一个iOS项目Test在iOS同级目录下建一个flutter modulefluttercreate--templatemodulemy_flutterpodfile编写如下#Uncommentthenextlinetodefineaglobalplatformforyourproject#platform:ios,'9.0'target'Test'do#Commentthenextl......
  • uniapp app安卓、ios文件选择 (上传pdf word video img )等
    1、hybrid 必须放在项目根目录下,不然会调用失效:如图 2、建立nvue 子窗体  代码:1<template>2<viewclass="nvue">3<textclass="popup-item"@click="clickfun">选择文件</text>4<textclass="ddddd......
  • 基于java语言开发的医院绩效核算系统源码
    医院绩效考核系统全套源码,医院绩效核算系统源码,java语言开发    医院绩效考核系统可根据工作绩效考核管理规定,配置相应的绩效考核模型,从工作量统计、核算维度、核算权重三方面计算工作绩效,利用数据处理和数据分析的支撑作用,实现对工作量统计和绩效考核结果的统计分析展示,为......
  • 前段时间面试Java碰到的一道有意思的题目
    看题前一段时间面试碰见一道题目,感觉挺有意思,特意记录了下来。大概内容就是有一个全局变量i,然后在main方法中有两个嵌套for循环,分别循环100次,然后循环中,开启新线程对变量i执行i++的操作。我对其简单做了一下修改。一起来看下这道题目,不运行,用肉眼的看的话,你觉得是多少?给你1min思......
  • javascript技巧
    1、过滤掉数组中的重复值。constarr=["a","b","c","d","d","c","e"]constuniqueArray=Array.from(newSet(arr));console.log(uniqueArray);//['a','b','c',&#......
  • java设计模式
    三大种类型的设计模式创建型模式:关注对象的创建过程。结构型模式:关注对象与类的组织模式行为型模式:关注对象之间的交互23种设计模式简单工厂模式定义:根据参数的不同返回不同类的实例。工厂方法模式定义:通过工厂子类来确定究竟应该实例化哪一个具体产品类例子:日志记录器......
  • iOS GCDWebServer 搭建本地服务器
    需求场景:H5页面读取系统相册,把选中的图片上传给前端H5.(H5不能直接读取沙盒的路径)方案1:读取到的二进制baseEncode字符串形式交互 弊端:安全性问题:JavaScript在浏览器中运行,可能存在潜在的安全风险,需要谨慎处理用户照片,以免导致隐私泄露或安全问题。性能问题:读取大型......
  • 解决Qt6“QApplication file not found”和“无法运行 rc.exe”错误
    最近开始学习Qt(趟坑),买了一本《C++GUIQt4编程》,照着书上的例子做,第一个就报编译不过,报错信息:'QApplication'filenotfound 查了下Qt助手, 使用qmake,需要加一句:QT+=widgets原因在于QApplication在Qt6中被放在了QtWidgets下,因此需包含widgets,当然最好的方式是根据Qt版本......