BIO示例代码

news2024/9/20 7:57:42

一个请求开一个线程

package org.example.demo;

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;

/**
 * @author hrui
 * @date 2024/7/27 11:28
 */
public class BIOServer {

    public static void main(String[] args) throws IOException {
        // 创建线程池

        //思路
        //1.创建一个线程池
        //2.如果有客户端连接,就创建一个线程,与之通讯(单独写一个方法处理)

        ExecutorService executorService = Executors.newCachedThreadPool();

        //创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动了");
        while (true) {
            //监听,等待客户端连接
            final Socket socket = serverSocket.accept();
            System.out.println("一个客户端连接了");
            //创建一个线程,与客户端通讯
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    //和客户端通讯
                    handler(socket);
                }
            });
        }

    }

    private static void handler(Socket socket) {
        System.out.println("线程信息,id=" + Thread.currentThread().getId() + ",名字=" + Thread.currentThread().getName());
        try {
            byte[] bytes = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            while (true) {
                int len = inputStream.read(bytes);
                if (len != -1) {
                    System.out.println(new String(bytes, 0, len));
                    if ("exit".equals(new String(bytes, 0, len).trim())) {
                        System.out.println("主动断开连接");
                        socket.close();
                        break;
                    }
                }else {
                    break;
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }

        }
    }
}

然后window+R

telnet 127.0.0.1 8888

ctrl+]  

通过send命令发送数据

也可以自己编写Socket Client

package org.example.demo;

import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author hrui
 * @date 2024/7/27 12:00
 */
public class BIOClient {
    public static void main(String[] args) {
        Socket socket = null;
        PrintWriter writer = null;
        Scanner scanner = new Scanner(System.in);

        try {
            // 1. 连接到本地运行的端口为 8888 的服务器
            socket = new Socket("localhost", 8888);
            System.out.println("已连接到服务器。");

            // 2. 创建一个输出流,用于向服务器发送数据
            OutputStream outputStream = socket.getOutputStream();
            writer = new PrintWriter(outputStream, true);

            // 3. 循环发送消息到服务器
            String message;
            while (true) {
                System.out.println("请输入要发送到服务器的消息(输入 'exit' 结束会话):");
                message = scanner.nextLine();
                writer.println(message);
                if ("exit".equalsIgnoreCase(message.trim())) {
                    System.out.println("退出会话。");
                    break;
                }
            }

            // 4. 可选地,这里可以读取服务器的响应
            // 为简洁起见,这个示例不包括服务器响应处理

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 5. 关闭资源
            try {
                if (writer != null) {
                    writer.close();
                }
                if (socket != null) {
                    socket.close();
                }
                System.out.println("客户端连接已关闭。");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 直接用BufferedReader

package org.example.demo;

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

/**
 * @author hrui
 * @date 2024/7/27 12:24
 */
public class BIOServer2 {
    public static void main(String[] args) throws IOException {
        // 创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        // 创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动了");
        System.out.println("等待客户端连接");

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

            // 创建一个线程,与客户端通讯
            executorService.execute(() -> handler(socket));
        }
    }

    private static void handler(Socket socket) {
        System.out.println("线程信息,id=" + Thread.currentThread().getId() + ",名字=" + Thread.currentThread().getName());
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))){
            String line;
            System.out.println("收到客户端消息");
            while ((line = reader.readLine()) != null) {
                // 实时输出接收到的消息
                System.out.println("收到的消息: " + line);
                // 检查是否包含结束标志
                if (line.trim().equalsIgnoreCase("exit")) {
                    System.out.println("客户端请求断开连接");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                System.out.println("连接已关闭。");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年第四届网络通信与信息安全国际学术会议(ICNCIS 2024,8月23-25)

2024年第四届网络通信与信息安全国际学术会议(ICNCIS2024)将于2024年8月23-25日于杭州召开。 会议围绕网络通信在信息安全领域中的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经…

智能化车载视频监控技术的崭新发展与应用

随着国内4G网络的快速建设和发展,智能车载终端监控领域的高清化进程也日益加快。尽管传统的车载终端监控已经在视频录像、GPS定位等基本应用方面取得了一定的成果,但随着视频分析技术的不断进步,普通视频监控已经无法满足日益增长的车载监控新…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统:centos7.6 服务器:2台虚拟机 达梦数据库版本:达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

Hive3:基本介绍

一、概述 Apache Hive是一款分布式SQL计算的工具, 其主要功能是: 将SQL语句翻译成MapReduce程序运行 Hive是单机工具,只需要部署在一台服务器即可。 Hive虽然是单机的,但是它可以提交分布式运行的MapReduce程序运行。 二、基本…

7月23日JavaSE学习笔记

异常: 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类(可抛出的) Throwable继承树 Error:错误/事故,Java程序无法处理,如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

C++客户端Qt开发——Qt窗口(对话框)

5.对话框 ①对话框介绍 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog…

【NLP自然语言处理】为什么说BERT是bidirectional

首先,来看一下Transformer架构图: 我们知道,Bert设计时主要采用的是Transformer编码器部分,要论述Bert为啥是双向的,我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前,需要对Transformer有一定的…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音?不管是娱乐圈还是现实生活,【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热! 本文将为您推荐8款电脑录音软件,并详细介绍电脑录音的多种方式…

【Windows和Linux校验文件MD5值(详细)】

1、 什么是MD5? 文件的MD5校验是一种常用的文件完整性验证方法。MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中,MD5算法通过计算文件的哈希…

访问所有节点的最短路径

847. 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的…

【吊打面试官系列-Dubbo面试题】服务调用是阻塞的吗?

大家好,我是锋哥。今天分享关于 【服务调用是阻塞的吗?】面试题,希望对大家有帮助; 服务调用是阻塞的吗? 默认是阻塞的,可以异步调用,没有返回值的可以这么做。 Dubbo 是基于 NIO 的非阻塞实现…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代,网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及,网络攻击手段日益复杂多变,各类安全威胁层出不穷。为了有效应对这些挑战,渗透测试作为一种重要的安全测试与评估方法&#xf…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架,它提供了丰富的界面设计工具和组件。在界面开发中,QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口,包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

AI绘画入门实践 | Midjourney:使用 --chaos 给图像风格来点惊喜

在 Midjourney 中,--chaos 影响初始图像网格的多样性,指 MJ 每次出的4张图之间的差异性。 默认值为0,值越高,差异性越大。 使用格式:--chaos 0-100的整数值 使用演示 a lot of flowers --chaos 0 --v 6.0a lot of fl…

基于微信小程序+SpringBoot+Vue的垃圾分类系统(带1w+文档)

基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 本垃圾分类小程序也是紧跟科学技术的发展,运用当今一流的软件技术实现软件系统的开发,让环保方面的信息完全通过管理系统实现科学化&#xf…

3.5 查找和排序算法

大纲 算法基础 常用的表示算法的方法 算法的复杂度 查找 顺序查找、二分查找 哈希查找 真题 排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 排序算法总结 真题

【数据结构】双向带头循环链表(c语言)(附源码)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 1.双向带头循环链表的概念和结构定义 2.双向带头循环链表的实现 2.1 方法声明 2.2 方法实现 2.2.1 创建新节点 2.2.2 初始化 2.2.3 …

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

WebLogic 9.x 10.x中间件监控指标解读

监控易是一款功能强大的IT系统监控软件,能够实时监控包括WebLogic中间件在内的各类应用和业务运行状态。对于WebLogic 9.x和10.x版本的监控,监控易提供了一系列详尽的指标,确保用户能够全面了解和掌握WebLogic集群和应用的性能状况。 在WebLo…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略完整思路 模型 代码 结果分享(仅供学习)

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略(2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy) 我们的未来有两种可能性:第一,我们将留…