Java之TCP编程综合案例
1.反转案例
搭建一个TCP客户端,从键盘录入整行数据(遇到quit结束录入)然后发送给服务器,再接收服务器返回的数据并输出。
package com.briup.chap12;public class Test064_ReversalClient {public static void main(String[] args) throws Exception {//1.创建Socket对象(指定服务器ip port) 连接到服务器Socket socket = new Socket("127.0.0.1",8989);System.out.println("成功连接到 8989服务器,socket: " + socket);//2.获取数据传输的IO流InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();//定义增强流 更好的实现功能// 打印流 写PrintStream ps = new PrintStream(os);// 缓冲流 读取Reader r = new InputStreamReader(is);BufferedReader br = new BufferedReader(r);//3.核心业务:数据传输// 从键盘录入整行数据 发送给服务器,遇到quit结束录入Scanner sc = new Scanner(System.in);System.out.println("请录入发送数据: ");String line = null;while(true) {//录入数据 并发送line = sc.nextLine();ps.println(line);System.out.println("发送数据成功");if("quit".equals(line)) break;//从服务器接收 返回的信息(反转字符串)String msg = br.readLine();System.out.println("接收信息: " + msg);}//4.关闭资源System.out.println("客户端即将关闭");br.close();ps.close();socket.close();}
}
搭建一个TCP服务器,逐行接收从客户端发送过来的字符串(读取到quit字符串则结束读取),然后对字符串进行反转,最后把反转的字符串返回给客户端。
public class Test064_ReversalServer {//StringBuffer类测试public static void main00(String[] args) {StringBuffer sb = new StringBuffer();//追加内容sb.append("hello world");System.out.println(sb);//反转sb.reverse();System.out.println("反转后: " + sb);//获取长度int len = sb.length();//清空sb.delete(0, len);System.out.println("清空后: " + sb);}public static void main(String[] args) throws Exception {//1.搭建服务器ServerSocket server = new ServerSocket(8989);System.out.println("服务器成功启动,端口: 8989");//2.接收客户端连接Socket socket = server.accept(); System.out.println("客户端成功连接: " + socket);//3.获取IO流并增强PrintStream ps = new PrintStream(socket.getOutputStream());// 缓冲流 读取BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//4.业务操作// 4.1 逐行收取数据String line = null;// 可变字符序列类,类似StringStringBuffer sb = new StringBuffer();while(true) {//清空序列sb.delete(0, sb.length());line = br.readLine();System.out.println("read: " + line);//读取到quit,则结束if("quit".equals(line))break;// 4.2 对收取的数据 进行 反转sb.append(line);//反转sb.reverse();//获取字符序列 包含的 字符串String msg = sb.toString();//4.3 将反转的字符串 返回给 客户端ps.println(msg);System.out.println("服务器 成功发送 反转信息...");}//5.关闭资源System.out.println("服务器即将关闭!");ps.close();br.close();socket.close();server.close();}
}
2. 传输对象
准备一个stud.txt文件,放到src/dir目录下,内容如下:
010.tom.19
001.zs.21
003.lucy.19
002.jack.20
搭建TCP客户端,逐行读取stud.txt中数据,然后转化为Student对象,最后将所有对象发送到服务器端。
Student基础类:
package com.briup.chap12;//注意,必须实现序列化接口
public class Student implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;private int age;//省略...
}
客户端代码:
package com.briup.chap12;/** 逐行读取stud.txt中 数据 --> Student对象* 再将所有对象 发送到 服务器*/
public class Test065_ObjectClient {public static void main(String[] args) throws Exception {//1.搭建客户端Socket socket = new Socket("127.0.0.1",8989);System.out.println("客户端成功连接,socket: " + socket);//2.获取流对象 并包装增强OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);//3.解析文件 得到对象 并发送BufferedReader br = new BufferedReader(new FileReader("src/dir/stud.txt"));String line = null;List<Student> list = new ArrayList<>();while((line = br.readLine()) != null) {//拆分数据 001.zs.20String[] arr = line.split("[.]");String id = arr[0];String name = arr[1];int age = Integer.parseInt(arr[2]);//封装学生对象 并添加到 list集合Student s = new Student(id,name,age);list.add(s);}// 发送集合(含所有学生)oos.writeObject(list);System.out.println("学生发送成功,数量: " + list.size());//4.关闭资源System.out.println("客户端即将关闭");oos.close();socket.close();}
}
搭建TCP服务器,接收从客户端发送过来的所有学生,然后遍历输出。
package com.briup.chap12;/** 搭建服务器,接收从客户端发送过来的所有学生* 遍历输出*/
public class Test065_ObjectServer {public static void main(String[] args) throws Exception {//1.搭建服务器,指定端口ServerSocket server = new ServerSocket(8989);System.out.println("服务器启动成功 端口 8989...");//2.接收客户端的连接Socket socket = server.accept();System.out.println("客户端成功连接:" + socket);//3.获取输入流 并 包装增强InputStream is = socket.getInputStream();ObjectInputStream ois = new ObjectInputStream(is);//4.接收 遍历数据List<Student> list = (List<Student>)ois.readObject();System.out.println("成功接收学生数量: " + list.size());for (Student s : list) {System.out.println(s);}//5.资源关闭System.out.println("服务器即将终止");ois.close();socket.close();server.close();}
}
3. 多线程案例
搭建一个TCP客户端,读取键盘信息,然后发送给服务器,遇到quit退出。
package com.briup.chap12;/** 接盘录入信息 然后发给服务器,遇到quit结束*/
public class Test066_ChatClient {public static void main(String[] args) throws Exception {//1.搭建客户端Socket socket = new Socket("127.0.0.1",8989);System.out.println("客户端成功连接,socket: " + socket);//2.封装得到IO流PrintStream ps = new PrintStream(socket.getOutputStream());//3.读取键盘信息 然后发送给服务器Scanner sc = new Scanner(System.in);String line = null;while(true) {line = sc.nextLine();if("quit".equals(line))break;ps.println(line);}//4.关闭资源System.out.println("客户端即将关闭");ps.close();socket.close();}
}
搭建TCP服务器,分离多线程接收客户端发送过来的数据,然后进行输出。
package com.briup.chap12;public class Test066_ChatServer {//多线程 服务器public static void main(String[] args) throws Exception {//1.搭建服务器,指定端口ServerSocket server = new ServerSocket(8989);System.out.println("服务器启动成功 端口 8989...");while(true) {//2.接收客户端的连接Socket socket = server.accept();System.out.println("客户端成功连接:" + socket);// 单独分离子线程 为 当前客户端提供服务Thread th = new Thread() {@Overridepublic void run() {//1.获取IO流BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//2.数据操作String line = null;while((line = br.readLine()) != null) {System.out.println("read: " + line);}}catch(Exception e) {e.printStackTrace();}finally {//3.关闭资源System.out.println("客户端对应资源即将关闭!");try {if(br != null)br.close();} catch (IOException e) {e.printStackTrace();}try {if(socket != null)socket.close();} catch (IOException e) {e.printStackTrace();}}}};th.start();}}//实现 单线程服务器,接收多个客户端 聊天信息public static void main01(String[] args) throws Exception {//1.搭建服务器,指定端口ServerSocket server = new ServerSocket(8989);System.out.println("服务器启动成功 端口 8989...");while(true) {//2.接收客户端的连接Socket socket = server.accept();System.out.println("客户端成功连接:" + socket);//3.封装IO流对象,逐行读取聊天信息并输出BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while((line = br.readLine()) != null) {System.out.println("read: " + line);}//4.关闭资源System.out.println("客户端即将关闭: " + socket);br.close();socket.close();//能否关闭 server}}
}
相关文章:
Java之TCP编程综合案例
1.反转案例 搭建一个TCP客户端,从键盘录入整行数据(遇到quit结束录入)然后发送给服务器,再接收服务器返回的数据并输出。 package com.briup.chap12;public class Test064_ReversalClient {public static void main(String[] ar…...
【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】
前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析,本篇文章主要讲述了:数据查询操作,数据增删改操作,索引和列名操作等等。欢迎大家一起探索讨论&#x…...
Spring Cloud全解析:注册中心之Eureka服务获取和服务续约
服务获取和服务续约 eureka客户端通过定时任务的方式进行服务获取和服务续约,在com.netflix.discovery.DiscoveryClient类中,启动了两个定时任务来进行处理 private void initScheduledTasks() {// 是否需要拉取if (clientConfig.shouldFetchRegistry(…...
三相整流电路交流侧谐波仿真分析及计算
一、三相桥式全控整流电路和功率因数测量电路SIMULINK 模型 如图4-1,根据高频焊机的主电路机构和工作原理,可将高频焊机三相整流部分等效为阻感负载的三相桥式全控整流电路模型,其由三相交流电压源、三相晶闸管整流桥、同步六脉冲触发器和阻感…...
了解Java中的反射,带你如何使用反射
反射的定义 反射(Reflection)是Java的一种强大机制,它允许程序在运行时动态地查询和操作类的属性和方法。通过反射,Java程序可以获取类的信息,比如类的名称、方法、字段,以及可以动态地创建对象、调用方法…...
【c++】基础知识——快速入门c++
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…...
AI学习记录 - 自注意力机制的计算流程图
过段时间解释一下,为啥这样子计算,研究这个自注意力花了不少时间,网上很多讲概念,但是没有具体的流程图和计算方式总结…...
JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件
目录 一. JavaScript、HTML、CSS简介 1.1 HTML简介和举例说明 1.2 CSS简介和举例说明 1.3 JavaScript 简介和举例说明 二. JavaScript 基本语法 2.1 变量类型和定义方式 2.2 逻辑运算符,比较运算符 2.3 流程控制,if,if...else...&…...
【C++】C++入门基础【类与对象】
目录 1.类 1.1类的定义 1.2struct 与 class对比 2.访问限定符 3. 类域 4.实例化 5.存储大小----内存对齐 6.this指针 1.类 1.1类的定义 class作为类的关键字,后面跟的是类的名字,如Stack,{}中的为类的主体,类定义结束时…...
Qt | QScatterSeries 散点图
点击上方"蓝字"关注我们 01、QScatterSeries QScatterSeries 的类,它将代表散点图中的一个系列。这个类将包含数据点、颜色和样式等属性,以及用于绘制散点图的方法。 02、main.cpp #include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow…...
无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验
在当今数字化的时代,远程协作已经成为工作和学习中不可或缺的一部分。然而,远程协作也面临着诸多挑战,如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议(Meeting)作为一款创新的工具,…...
C基础练习(学生管理系统)
1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。” 同理,当…...
网络安全抓包封包WEB
目录 1.抓包 1. 网络故障排除 应用 意义 2. 网络安全监控 应用 意义 3. 性能优化 应用 意义 4. 协议分析与开发 应用 意义 5. 数据分析与合规性审计 应用 意义 抓包工具 总结 2.抓包的应用对象 1. 网络设备 路由器和交换机 防火墙和入侵检测系统ÿ…...
Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)
文章目录 为什么需要多版本管理?在Spring Boot中实现多版本API的常用方法1. URL路径中包含版本号2. 请求头中包含版本号3. 自定义注解和拦截器 注意事项 为什么需要多版本管理? API接口的多版本管理在我们日常的开发中很重要,特别是当API需要…...
普中51单片机:DS18B20温度传感器操作指南(十三)
文章目录 引言电路图引脚讲解初始化时序写时序读时序温度变换温度读取完整代码 引言 DS18B20是一款单总线接口的数字温度传感器,仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解,关于DS18B20温度传感器的详细操作原理&#…...
【网络】网络的发展历程及其相关概念
1.什么是网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展渗透形…...
鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
文章目录 一、如何安装 ohpm-cli二、如何安装三方库1、在 oh-package.json5 文件中声明三方库,以 ohos/crypto-js 为例:2、安装指定名称 pacakge_name 的三方库,执行以下命令,将自动在当前目录下的 oh-package.json5 文件中自动添…...
C++的标准模板库简单介绍
C的标准模板库(STL, Standard Template Library)是一个强大的工具,旨在提供高效和灵活的数据结构和算法。STL的设计目的是使C程序更加通用和可重用。以下是对STL的详细介绍: 1. STL的组成部分 STL主要由以下几部分组成ÿ…...
安卓常用控件ListView
文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup,将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…...
优秀的行为验证码的应用场景与行业案例
应用场景 登录注册 : 验证码适用于App、Web及小程序等用户注册场景,可以抵御自动机恶意注册,垃圾注册、抵御撞库登录、暴力破解、验证账号敏感信息的修改,同时可以有效阻止撞库攻击,从源头进行防护,保障正…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
