Java 网络编程之TCP(一):基于BIO

devtools/2024/9/18 21:08:07/ 标签: 网络, java, tcp/ip, BIO

环境:

jdk 17

IntelliJ IDEA 2023.1.1 (Ultimate Edition)

Windows 10 专业版 22H2

TCP:面向连接的,可靠的数据传送协议

Java中的TCP网络编程,其实就是基于常用的BIO和NIO来实现的,本文先讨论BIO

BIO:是JDK 1.4引入的网络编程模型,主要是指阻塞I/O编程模型

BIO中的阻塞体现在:

服务端:

服务器等待客户端连接的accept方法阻塞;

服务器读取客户端数据,等待数据准备好的阻塞;

客户端:

客户端读取服务器数据,等待数据准备好的阻塞;

服务端高并发:

既然服务端有阻塞,我们要想提高效率,得用多线程,一个负责处理一个客户端的业务数据;

同时,为了提高线程的使用效率,当一个客户端断开连接之后,该线程可以复用来处理其他线程;

获取一个线程负责多个客户端,进行轮询处理,这样就复杂些了;我们在其他文章中再讨论;

本文,我们使用最简单的方式,一个线程处理一个客户端数据,线程不复用;先把整个BIO的模型实现出来;

需求如下:基于BIO实现一个简单的服务端接收客户端的数据的网络模型;这个也是聊天室的基础;

服务端:可以接收多个客户端连接,通过字节流接收客户端发送的消息;服务端只接收,不发送

客户端:接收控制台输入的数据,然后通过字节流发送给服务端

服务端代码如下:

java">import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 基于BIO的TCP网络通信的服务端,可以接收多个客户端连接,通过字节流接收客户端发送的消息;* 服务端只接收,不发送* 一个客户端需要使用一个线程* todo:线程资源复用** @author freddy*/
class ChatServer {public static void main(String[] args) throws IOException {// 开启server 监听端口ServerSocket serverSocket = new ServerSocket(9999);while (true) {Socket client = serverSocket.accept(); // 阻塞操作,需要新的线程处理客户端// 接收Client数据,并转发new Thread(new ServerThread(client)).start();}}
}/*** 服务端的线程,一个客户端对应一个*/
class ServerThread implements Runnable {Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {// 获取输入流程,读取用户输入// 持续接收Client数据,并打印System.out.println("server had a client" + socket);try (InputStream inputStream = socket.getInputStream()) {byte[] buffer = new byte[1024];int len;// read操作阻塞,直到有数据可读while ((len = inputStream.read(buffer)) != -1) {System.out.println("serer receive data from " + socket + " : " + new String(buffer, 0, len));}} catch (IOException e) {System.out.println(socket + " disconnect ");}}
}

客户端代码如下:

java">import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*** 基于BIO的TCP网络通信的客户端,接收控制台输入的数据,然后通过字节流发送给服务端** @author freddy*/
class ChatClient {public static void main(String[] args) throws IOException {// 连接serverSocket serverSocket = new Socket("localhost", 9999);System.out.println("client connected to server");// 读取用户在控制台上的输入,并发送给服务器InputStream in = System.in;byte[] buffer = new byte[1024];int len;OutputStream outputStream = serverSocket.getOutputStream();// read操作阻塞,直到有数据可读while ((len = in.read(buffer)) != -1) {System.out.println("client receive data from console" + in + " : " + new String(buffer, 0, len));// 发送数据给服务器端outputStream.write(new String(buffer, 0, len).getBytes()); // 此时buffer中是有换行符}}
}

测试:

先开启服务端;

然后开启两个客户端,在idea中需要打开Run -> Edit Configurations,选择我们的Application, 然后在右侧点击【Modify options】,选择【Allow multiple instances】,即可开启多个相同的Application ;

备注:不同版本的idea,选项位置可能有所不同


http://www.ppmy.cn/devtools/15061.html

相关文章

视频教程下载:用ChatGPT快速提升股票投资能力

学完此视频后可以获得: 学习如何使用人工智能/Chatgpt进行基础/快速/高级财务与研究分析 学习如何使用人工智能/Chatgpt对任何公司进行定性投资研究 学习如何使用人工智能/Chatgpt对任何公司进行定量投资研究 学习如何使用人工智能/Chatgpt创建、预测和分析财务…

Python程序设计教案

文章目录: 一:软件环境安装 第一个软件:pycharm 第二个软件:thonny 第三个软件:IDIE(自带的集成开发环境) 二:相关 1.规范 2.关键字 3.Ascll码表 三:语法基础…

大模型自动优化 Prompt 的可行性分析

随着自然语言处理领域的快速发展,大模型(Large Language Models)已经成为了当前研究的热点。大模型通过在海量语料上进行预训练,能够学习到丰富的语言知识和通用表示,在各种自然语言处理任务上取得了突破性的进展。然而…

Android网络安全配置:允许明文HTTP通信的正确姿势20240418

引言: 随着Android 9 (Pie) 的发布,Google加强了平台的安全性要求,特别是对网络通信的安全性进行了重大更新。默认情况下,Android系统禁止应用使用未加密的明文HTTP进行网络通信。这篇博客将介绍如何在遵守新安全政策的同时&…

小程序APP屏幕悬浮按钮可拖动可展开

示例&#xff1a; 插件地址&#xff1a;suspensionButton 悬浮按钮 - DCloud 插件市场 使用方式&#xff1a; import pxSuspenButton from /components/px-suspen-button/index components: { pxSuspenButton }, <pxSuspenButton :centerIcon"centerIcon" :bgCo…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …

苍穹外卖学习笔记(8.用户端历史订单模块,商家端订单管理模块)

目录 一、商家端订单管理模块1、查看历史订单2、查询订单详情3、取消订单4、再来一单5、代码开发6、测试 二、用户端历史订单模块1、订单搜索2、各个状态的订单数量统计3、查询订单详情4、接单5、拒单6、取消订单7、派送订单8、完成订单9、代码开发10、测试 三、校验收货地址是…

【Nginx】(三) Nginx配置文件精解:从入门到精通的完整指南

Nginx&#xff0c;作为一款功能强大的 Web 服务器和反向代理软件&#xff0c;已经成为实现这些目标的行业标准。然而&#xff0c;Nginx的强大功能往往伴随着复杂的配置需求。对于想快速掌握 Nginx 配置的人来说&#xff0c;理解其配置文件的结构至关重要。 在本文中&#xff0…

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;三&#xff09;注册中心 Eureka&#xff08;3&#xff09; 段子手168 1、eureka&#xff1a;高可用的引入 Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署&#xff0c; Eureka Server 实例会彼此增量地…

江西智博环境| 邀您参加2024全国水科技大会暨技术装备成果展览会

展位号&#xff1a;A28 企业介绍 江西智博环境技术有限公司始创于2008年初&#xff0c;总部位于江西省域副中心城市-赣州。公司主要从事一体化净水设备、单村供站、泵船、无负压供水设备自动化控制系统、低配电系统、工艺设备及智慧水务的设计研发、生产、销售、安装、调试等业…

RIME-SVM,基于RIME寒冰优化算法优化SVM支持向量机回归预测 (多输入单输出)-附代码

支持向量机&#xff08;SVM&#xff09; 支持向量机&#xff08;SVM&#xff09;是一种广泛用于分类和回归的强大监督学习算法。在回归任务中&#xff0c;特别是在SVM被用作支持向量回归&#xff08;SVR&#xff09;时&#xff0c;目标是找到一个函数&#xff0c;这个函数在给…

vue+element 树形结构 改成懒加载模式(原理element有),这里只做个人理解笔记

1 找到属性标签添加 lazy 和 :load"loadNode" 这两个属性 2 引入树形接口,并和后端约定好传值,(拿我的举例 第一次获取全部父级默认第一次传参数:{ parentId : 0},可获取全部父级 第二次通过点击的子级把子级id传进去,这一步就用到了:load"loadNode&quo…

kafka大数据采集技术实验(未完待续)

Kafka环境搭建 下载地址&#xff1a;https://link.zhihu.com/?targethttps%3A//kafka.apache.org/downloads解压启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties需要注意的是 : " c o n f i g / z o o k e e p e r . p r o p e r t i e s &q…

鸿蒙应用开发之Web组件4

前面学习了Web组件加载本地的文件数据,这样很方便不需要网络的界面显示,或者提示类的界面,比如软件使用说明书,又比如软件使用协议,又或者固定显示的长文本数据。如果有多个文件,也可以通过按钮来切换不同的文件显示。 如果文本比较短小的HTML数据,放到文件里,再通过文…

idea连接Docker数据库

我们在docker下创建了数据库&#xff0c;想要更方便的查看和操作该数据库&#xff0c;idea和DataGrip或者其他软件都可以。在数据库连接时需要填写数据库名字&#xff0c;主机&#xff0c;端口&#xff0c;数据库用户名和密码。 输入之后先不要点击OK和按Enter键&#xff0c;我…

基于STM32的蓝牙小车(虚拟串口模拟)的Proteus仿真

文章目录 一、前言二、仿真图1.要求2.思路3.画图3.1 电源部分3.2 超声波测距部分3.3 电机驱动部分3.4 按键部分3.5 蓝牙部分3.6 显示屏部分3.7 整体 4.仿真5.软件 三、总结 一、前言 proteus本身并不支持蓝牙仿真&#xff0c;这里我采用虚拟串口的方式来模拟蓝牙控制。 这里给…

MATLAB初学者入门(7)—— 参数估计

参数估计是利用实验数据来推断模型参数的过程&#xff0c;这在科学和工程领域中非常常见。MATLAB提供了多种工具来进行参数估计&#xff0c;尤其是当模型表现为非线性时。以下是使用MATLAB进行参数估计的一种常见方法&#xff0c;我们将通过一个具体的案例——化学动力学模型的…

自建zerotier服务——实现更快速安全的远程连接

zerotier介绍 ZeroTier 是地球上智能可编程的以太网交换机。它允许所有网络设备、虚拟机 (VMs)、容器和应用程序通信&#xff0c;就好像它们都位于同一个物理数据中心或云区域中一样。 功能简介&#xff1a; 全球虚拟网络&#xff1a; ZeroTierOne 可以创建一个全球虚拟的软件…

clickhouse学习笔记04

ClickHouse高可用之ReplicatedMergeTree引擎介绍 ClickHouse高可用架构准备-环境说明和ZK搭建 RPM安装ClickHouse 上传我们的clickhouse rpm文件。 安装&#xff1a; 中途需要输入用户名和密码 可以不设置 直接回车。 启动&#xff1a; 查看状态&#xff1a; 查看端口是否占用…

stm32驱动GX100、GX101温度传感器

一、GX100S简介 GX100S温度传感器是一种用于测量温度的传感器。它采用高精度的温度感知元件&#xff0c;能够快速、准确地测量环境温度。它具有以下特点&#xff1a; 高精度&#xff1a;采用先进的温度感知技术&#xff0c;可以提供高精度的温度测量结果。快速响应&#xff1…