网络编程之BIO

原文连接

介绍

BIO(blocking I/O)就是传统的 java io 编程,BIO是同步阻塞模型,服务器端实现模式为一个连接只有一个线程处理,如果这个连接不做任何事情,会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。
BIO模型适用于连接数较小且固定的架构,这种方式对服务器资源要求比较高,JDK1.4以前的唯一选择,优点是程序简单易理解。

工作原理

在这里插入图片描述
1、服务端启动一个ServerSocket
2、客户端启动Socket对服务器进行通讯,默认情况下服务器端需要对每个客户端建立一个线程与之通讯
3、客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
4、如果有响应,客户端线程会等待请求结束后,再继续执行

代码演示

服务端

package com.tk.netty.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * BIO模型
 *
 * @author taoke
 * @date 2022/5/6
 */
public class BIOServer {

    public static void main(String[] args) throws Exception {
        //1.创建一个线程池
        //2.如果有客户端连接,就创建一个线程,与之通讯
        ExecutorService threadPool = Executors.newCachedThreadPool();

        //创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        System.out.println("服务器启动了!");

        while (true) {
            System.out.println("连接中。。。");
            //监听,等待客户端连接
            final Socket socket = serverSocket.accept();
            System.out.println("连接到一个客户端");

            //创建一个线程,与之通讯
            threadPool.execute(() -> handler(socket));
        }

    }

    /**
     * 和客户端进行通讯
     *
     * @param socket 套接字
     */
    public static void handler(Socket socket) {
        try {
            byte[] bytes = new byte[1024];
            //通过socket获取输入流
            InputStream inputStream = socket.getInputStream();
            System.out.println("线程id=" + Thread.currentThread().getId() + ", 线程名字=" + Thread.currentThread().getName());

            //循环读取客户端发送的数据
            int len;
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(Thread.currentThread().getName() + ": " + new String(bytes, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果

1、服务端启动,等待客户端连接
在这里插入图片描述
2、cmd telnet连接服务端
在这里插入图片描述
客户端 连接成功,按 ctrl+]
在这里插入图片描述
服务端连接成功,第二个连接中是因为,服务端accept()监听阻塞,当有客户端进来时,会创建一个子进程,然后重新回到主线程。
在这里插入图片描述

3、客户端发送消息与服务端进行通讯
在这里插入图片描述
服务端收到消息
在这里插入图片描述

基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业。基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RAG 与大模型技术的医疗问答系统源码(高分毕设项目)基于 RA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值