当前位置: 首页 > news >正文

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人@小虚竹 想对你说:

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

 各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习【Java】TCP网络编程:从可靠传输到Socket实战

目录

1.首先我们再说一下TCP和UDP的区别和相同点

2.连接:通信双方都会记录对方的信息

3.主要是两个api ServerSocket和Socket

4.TCP服务端实战代码演示

5.TCP客户端实战代码演示


TCP的socket的api的差异很大,但是和前面的IO有很大的关联

1.首先我们再说一下TCP和UDP的区别和相同点

1.TCP是有连接的,UDP无连接(这一点可以在代码中体现)

2.TCP是面向字节流流的,UDP是面向数据报的

3.TCP是可靠传输的,UDP是不可靠传输的(这一点在代码中体现不出来)

4.TCP和UDP都是全双工的

2.连接:通信双方都会记录对方的信息

UDP:每次发送数据报都要指定对方的地址(UDP没有存储这个信息)

一张图

TCP:不需要(不过需要内核自动和客户端建连接(TCP的三次握手,后面我会进行讲解)这个过程是系统内核自动完成的)

对于应用程序来说,客户端是发起“建立连接”

服务器这边:把内核中建立好的连接拿到应用程序里面()

这个ServerSocket只负责绑定端口号,然后通过accept方法 把建立好的连接拿过来(但是一瞬间有很多连接的话,就像生产者消费者模型里面只能进行阻塞等待)

3.主要是两个api ServerSocket和Socket

ServerSocket是给服务器用的类,使用这个类用来绑定端口号(这个类负责把系统内核里面已经建立好的连接从队列里面拿过来,)

Socket:既会给服务器使用的类,也会给客户端使用,通过socket这个对象和客户端进行交互

(这两个类都是用来表示socket文件的,抽象了网卡这样的硬件设备)

4.TCP服务端实战代码演示

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TcpEchoServer {      // 读取用Scanner ,发送用PrintWriter//  1.首先serverSocket调用系统API把连接拿过来,然后交给socket//  我们就有了socket这个对象,这个时候我们就可以宣布这个客户端成功和我们服务器建立了联系并且我们拿到了// 2.然后我们通过字节流把数据从socket抽象的文件里面读取到,用try包起来,用scanner从流里面读取// 3. 我们拿到字符串进行响应// 4. 把返回的字符串通过字节流(我们的字符串通过字符流转换成字节流)写回去// 5. 把信息打印出来private ServerSocket serverSocket = null;public TcpEchoServer(int serverPort) throws IOException {// 利用这个系统API从内核中取到已经建立好的连接// 这个和客户端构造的socket完全不一样,客户端的那个是我们已经拿到的连接serverSocket = new ServerSocket(serverPort);  // 服务器自己分配端口号,}public void start() throws IOException {System.out.println("服务器启动");// 把队列里面建立好的连接拿过来while(true){   //  要一直不断地从那个内核里面不断地拿我们已经建立好的连接!!!Socket Clientsocket = serverSocket.accept();/* //创建一个新的线程把这个请求进行响应Thread t = new Thread(() ->{possessCollection(Clientsocket);});t.start();*/// 但是线程池是更好一点点的选择ExecutorService service = Executors.newCachedThreadPool();service.submit(() ->{possessCollection(Clientsocket);});}}public void possessCollection(Socket Clientsocket){   //System.out.printf("[%s,%d] 客户端上线\n" , Clientsocket.getInetAddress(),Clientsocket.getPort());// 把端口号和IP拿到try(        InputStream inputStream = Clientsocket.getInputStream();   //  这里要用 "  ;  "OutputStream outputStream = Clientsocket.getOutputStream()){// 客户可能等会还会继续发送请求(我们循环处理)Scanner scanner = new Scanner(inputStream);//每一次读一次缓冲区,缓冲区里面的东西就少一次,都被我读出来了嘛while(true){if(!scanner.hasNext()){// 用户不再输入的时候,就直接跳出循环!!!,一直等待用户输入System.out.printf("[%s,%d] 客户端下线\n" , Clientsocket.getInetAddress(),Clientsocket.getPort());break;}String request = scanner.next();// 拿到字符串进行响应String response = process(request);// 拿到响应//4. 拿到字符串的响应,然后我们通过字符流转字节流传递出去PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(response);// 此处的println不是写到控制台了,而是写到outputStream的流对象了,也就是写入到ClientSocket里面了// 自然这个数据也是通过网卡发出去了printWriter.flush();// 再刷新一下缓存,防止没有发出去,// 总结:  发送和接收数据都是通过socket文件的字节流输入输出来实现,用scanner读字节流,用printWriter写字符串// 5.打印一下交互过程System.out.printf("[%s,%d] req=%s resp=%s\n",Clientsocket.getInetAddress(),Clientsocket.getPort(),request,response);}}catch(IOException e){e.printStackTrace();}finally{try {Clientsocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}private String process(String request) {  // 回显服务器return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer = new TcpEchoServer(9090);tcpEchoServer.start();}}

但是这里面会出现两个问题

问题一:为什么我们的ServerSocket对象没有进行close操作,但是Socket对象却需要close操作呢?这样不会出现文件资源泄露吗?

首先我们需要知道什么时候回造成文件资源泄露?

直频繁申请但是一直不释放就会(什么文件的表项啥的)

但是ServerSocket对象从头到尾只创建过一次对象,而且一直在把内核中建立的连接拿到。所以说ServerSocket这个对象的生命周期是是伴随着进程消失的(因此不需要特地的进行回收,等到进程解释JVM会把这个进程里面的东西一起回收了)

但是?

问题二:等待我们写完客户端的代码之后进行讲述

如果启动多个客户端和服务器进行连接(就不行了,这个服务器一直在等待客户端进行输入,我们就需要多个线程并发拿到这个连接)

但是频繁地创建和销毁线程也会有很大开销,线程池是更好一点点选择

5.TCP客户端实战代码演示

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoClient {/*** 1.随机分配一个端口的发出信息(我们要把服务器的IP地址和端口号给搞进去)* 2.我们循环输入一个字符串,把这个字符串用字符流转换成字节流写到socket抽象的文件里面* 3.然后我们接收响应(不像服务器,我们又不需要进行处理)* 4.我们直接通过Scanner把字节流里面的内容读出来就好了*/private Socket socket = null;public TcpEchoClient(String serverIP,int serverPort) throws IOException {socket = new Socket(serverIP,serverPort);}public void start(){System.out.println(" -> ");Scanner scanner = new Scanner(System.in);try(OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream()){while(true){/* if(!scanner.hasNext()){  // 用户不想输入了,就直接退出了break;   不需要这个}*///     * 2.我们循环输入一个字符串,把这个字符串用字符流转换成字节流写到socket抽象的文件里面String request = scanner.next();PrintWriter printWriter = new PrintWriter(outputStream);  // 这些流尽量都放到try()里面printWriter.println(request);printWriter.flush();// 一定不要忘记刷新缓存区'//      * 4.我们直接通过Scanner把字节流里面的内容读出来就好了Scanner scannerNetwork = new Scanner(inputStream); // 这个Scanner尽量也是放到try()里面String response = scannerNetwork.next();System.out.println(response);}}catch(IOException e){e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient tcpEchoClient = new TcpEchoClient("127.0.0.1",9090);tcpEchoClient.start();}
}

上述就是【Java】TCp网络编程:TCP网络编程:从可靠传输到Socket实战的全部内容啦

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~

您的支持就是我最大的动力​​​!!!

相关文章:

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…...

背包问题——多重背包(C语言)

代码如下&#xff1a; #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代码{fo…...

微服务》》Kubernetes (K8S) 集群配置网络》》Calico

嘻嘻嘻 以Calico 为例子 Calico官网 官网上有安装Calico插件的步骤 步骤 要在主节点 主节点 主节点 执行 kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml kubectl get pod --all-namespaces kubec…...

寄存器(内部访问)

内存中字的储存 我们之前提到过&#xff0c;字由两个字节组成&#xff0c;当我们用16位寄存器来储存时&#xff0c;把字分别储存在连续的两个内存单元中&#xff0c;高位字节放在高地址单元中&#xff0c;低位字节则放在低位地址单元中。 例如上图&#xff0c;0、1两个单元存放…...

Vue2 watch侦听器(监听器)

watch侦听器&#xff08;监听器&#xff09;功能是监听数据变化&#xff0c;执行一些业务逻辑 或 异步操作。 核心选项 ‌handler‌ 监听函数&#xff0c;接收 (newVal, oldVal) 作为参数。‌deep: true 深度监听对象/数组内部变化。‌immediate: true‌ 在组件创建时…...

【PCB工艺】基础:电子元器件

电子原理图&#xff08;Schematic Diagram&#xff09;是电路设计的基础&#xff0c;理解电子元器件和集成电路&#xff08;IC&#xff09;的作用&#xff0c;是画好原理图的关键。 本专栏将系统讲解 电子元器件分类、常见 IC、电路设计技巧&#xff0c;帮助你快速掌握电子电路…...

linux性能监控的分布式集群 prometheus + grafana 监控体系搭建

prometheusgrafana分布式集群资源监控体系搭建 前言一、安装 prometheus二、在要监控的服务器上安装监听器三、prometheus服务器配置四、grafana配置大屏五、创建Linux监控看板五、监控windows服务器注意事项 前言 Prometheus 是一个开源的 ​分布式监控系统 和 ​时间序列数据…...

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在&#xff1a;3.如果未找到&#xff0c;可能是内核模块未正确生成。尝试安装 linux-modules-extra&#xff1a;4.再次检查 iwlwifi.ko 是否存在&#xff1a;5.确…...

LinkedList与链表

ArrayList的缺陷 在上一篇博客中&#xff0c;小编已经较为详细得给大家介绍了ArrayList这个结构了。但是ArrayList存在一些缺陷&#xff1a;由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&am…...

CCF 编程能力认证 C++ 四级宝典

CCF编程能力等级认证&#xff08;以下简称GESP&#xff09;2025年四次认证时间分别为&#xff1a;3月22日、6月28日、9月27日、12月20日&#xff0c;认证方式为线下机考&#xff0c;认证语言包括&#xff1a;C、Python和Scratch三种语言&#xff0c;其中Scratch认证为一到四级&…...

信创系统极速文件查找:locate 命令详解

原文链接&#xff1a;信创系统极速文件查找&#xff1a;locate 命令详解 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统&#xff08;如 统信 UOS、麒麟 KOS&#xff09;中&#xff0c;查找…...

数据集获取

sklearn数据集 sklearn有四部分数据。其中sklearn的数据集有两部分真实的数据,一部分嵌入到了sklearn库中,即安装好sklearn后就自带了一部分数据,这些数据的规模比较小称为small toy datasets ,还有一部分数据是需要在网上下载的,sklearn提供了下载的api接口,这些数据规…...

三格电子PLC数据采集网关-工业互联的智能枢纽

在工业自动化领域&#xff0c;设备间的数据互通与协议兼容是核心挑战之一。三格电子推出的PLC据采集网关SG-PLC-Private&#xff0c;凭借其多协议兼容、高稳定性和灵活配置能力&#xff0c;成为工业物联网&#xff08;IIoT&#xff09;中实现设备互联的关键设备。本文将从产品功…...

【sgFloatDialog】自定义组件:浮动弹窗,支持修改尺寸、拖拽位置、最大化、还原、最小化、复位

sgFloatDialog <template><div :class"$options.name" v-if"visible" :size"size" :style"style"><!-- 托盘头部 --><div class"header" ref"header" dblclick.stop.prevent"dblclic…...

conda 常用命令

常用 Conda 命令整理环境管理 conda create --name 环境名 &#xff1a;创建新环境 conda activate 环境名 &#xff1a;激活环境 conda deactivate&#xff1a;退出环境 conda env list&#xff1a;列出所有环境 conda remove --name 环境名 --all &#xff1a;删除环…...

神聖的綫性代數速成例題10. N維矢量綫性運算、矢量由矢量組綫性表示、N個N維矢量相關性質

N 維矢量綫性運算&#xff1a; 設&#xff0c;是維矢量&#xff0c;是數。加法&#xff1a;。數乘&#xff1a;。 矢量由矢量組綫性表示&#xff1a; 設是n維矢量&#xff0c;若存在一組數&#xff0c;使得&#xff0c;則稱矢量可由矢量組綫性表示。 N 個 N 維矢量相關性質&…...

力扣977. 有序数组的平方(双指针技巧)

Problem: 977. 有序数组的平方 文章目录 题目描述思路Code 题目描述 思路 由于数组是非递减且包含正、负数&#xff0c;则假如我们将数组中的每一个元素取平方并且将其从原始的某一个位置分开成两个数组来看待&#xff08;一个数组从前往后看&#xff0c;一个数组从后往前看&am…...

单片机flash存储也做磨损均衡

最近在做一个项目&#xff0c;需要保存设置数据&#xff0c;掉电不丢失。那么首先想到的是加个24c02&#xff0c;是一个eeprom&#xff0c;但是客户板太小&#xff0c;没有办法进行扩展。后面就找了一个带ee的OTP单片机&#xff0c;发现擦写次数有限&#xff0c;只有1000次&…...

第7章 类与面向对象

6-1 二维平面上的点操作&#xff08;Python3&#xff09; 题目描述 设计一个表示二维平面上点的类 Point。该类应该包含以下功能&#xff1a; 两个私有属性 _x 和 _y&#xff0c;分别表示点的横坐标和纵坐标。 一个构造函数 __init__&#xff0c;用于初始化点的坐标。 一个…...

【算法】力扣 713题:乘积小于 K 的子数组之深入思考

文章目录 前言题目&#xff1a;乘积小于 K 的子数组参考思路方法一&#xff1a;滑动窗口方法二&#xff1a;二分查找 参考题解方法一&#xff1a;滑动窗口解法方法二&#xff1a;二分查找解法 深入思考浮点精度&#xff1f;right - left 1&#xff1f;二分法&#xff1f;哈希优…...

Milvus vs. ElasticSearch:向量库检索性能测试

目录 1. 构建检索库2. 测试条件3. 测试结果4. 性能分析5. 结论 1. 构建检索库 构建通用场景库总计约2万张。构建车辆数据库总计约12万张。构建公共数据库&#xff0c;包括Flickr30k、COCO、nlvr2、vqa等数据集约43万张。 2. 测试条件 环境说明&#xff1a;分别单机部署Milvu…...

高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构

高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构 在解决复杂问题时,选择合适的数据结构往往是成功的关键。本文将深入探讨四种强大而实用的高级数据结构:并查集、跳表、布隆过滤器和高效缓存结构(LRU和LFU),包括它们的原理、实现、复杂度分析和实际应用场景。 1.…...

CVPR2025 | 蚂蚁浙大提出MP-GUI算法:全方位增强MLLM的GUI理解能力

近日&#xff0c;计算机视觉和模式识别领域国际顶会CVPR 2025公布了论文录用结果&#xff0c;蚂蚁集团与浙江大学EAGLE实验室合作的论文 “MP-GUI: Modality Perception with MLLMs for GUI Understanding” 被成功录用。 IEEE国际计算机视觉与模式识别会议&#xff08;CVPR&a…...

过河卒cpp动态规划

题目如下 思路 利用二维数组存储棋盘的各个点的位置&#xff0c;首先初始化所有位置为0&#xff0c;然后记马的位置为1&#xff0c;将m&#xff0c;n同时加2&#xff0c;避免马的位置溢出&#xff0c;然后对二维数组进行递推算出dp[n][m] 代码及解析如下 谢谢观看&#xff01;…...

春天咋会像冬天一样

2025年3月20日&#xff0c;阴&#xff0c;天寒 遇见的事&#xff1a;21&#xff5e;24号去曲靖招生&#xff0c;打电话给我说换一下&#xff0c;换了后又没有车了&#xff0c;这么坑。 感受到的情绪&#xff1a;你知道么&#xff0c;换的前提是有车。开车不给报销&#xff0c;…...

DooTask在Linux的离线部署教程

DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地&#xff0c;下载地址 通过网盘分享的文件&#xff1a;DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件&#xff1a;DooTask项目…...

分享下web3j 常见用法

转账 fun sendEthTransaction(privateKey: String,toAddress: String,amount: BigDecimal) {//chainIdval chainId:Long 1//url 可以从https://chainlist.org/里面获取可用节点//eth转账&#xff0c;bnb同理&#xff0c;但需发送到bnb对应节点val url "https://xxx"…...

跨域问题确认及处理

背景如下&#xff1a; 近期在做的项目中&#xff0c;有个奇怪的需求&#xff0c;需要在JSP项目中嵌套一个VUE项目&#xff0c;原因是&#xff1a;JSP项目是在运且不大方便重构的一个项目&#xff0c;新需求又想为了未来着想做一套单独的项目&#xff0c;无奈只能嵌套。 当项目开…...

PyCharm如何添加已有的conda环境

1、点击文件中的设置 2、在右侧选中项目下的Python解释器 3、在右侧解释器一栏找到添加解释器选项 4、选择本地解释器 5、填写信息 环境&#xff1a;选择现有 类型&#xff1a;conda conda路径&#xff1a;...\Anaconda\Scripts\conda.exe 环境&#xff08;python路径&…...

揭开最大子段和问题的神秘面纱:从暴力法到极致优化的算法之旅

最大子段和问题&#xff1a;从暴力法到优化的算法解析 题目链接 题目描述 给出一个长度为 nn 的序列 aa&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 n。第二行有 n 个整数&#xff0c;第 i 个整数表示序列的…...

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…...

提升模型性能:数据增强与调优实战

‌一、为什么需要数据增强&#xff1f; 数据增强通过对训练图像进行‌随机变换‌&#xff0c;能够有效&#xff1a; 增加数据多样性&#xff0c;防止过拟合提升模型对不同视角、光照条件的鲁棒性在数据量不足时显著提升模型性能 二、MNIST手写数字识别实战‌ ‌1. 加载数据…...

Emacs 折腾日记(十八)——改变Emacs的样貌

截止到上一篇文章为止&#xff0c;之前教程 的内容都看完了&#xff0c;虽然它的后记部分提供了一些后续进阶的内容需要我们自己读手册。但是我不太想继续在elisp上死磕了。看着自己学了那么久的elisp&#xff0c;但是自己的emacs仍然没有半点改变&#xff0c;这个时候各位读者…...

VNA操作使用学习-14 再测晶振特性

再测一下4Mhz晶振&#xff0c;看看特性曲线&#xff0c;熟悉一下vna使用。 s11模式&#xff0c;找遍了各种format都无法显示&#xff0c;只有这一种&#xff08;s11&#xff0c;Resistance&#xff09;稍微显示出一个谐振&#xff0c;但是只有一个点。 s21模式 这是201p&#…...

CentOS7 离线下载安装 GitLab CE

依赖下载 https://vault.centos.org/7.9.2009/os/x86_64/Packages/policycoreutils-python-2.5-34.el7.x86_64.rpm 依赖安装 rpm -ivh policycoreutils-python-2.5-34.el7.x86_64.rpm 查看是否安装依赖 rpm -qa | grep policycoreutils-pythongitlab下载 https://packag…...

LeetCode 热题 100_跳跃游戏 II(79_45_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏 II&#xff08;79_45&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心选择&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法&#xff09;…...

《Linux系统编程篇》Linux Socket 网络编程01 API介绍(Linux 进程间通信(IPC))——基础篇

文章目录 引言1. **创建Socket**2. **绑定Socket**3. **监听Socket**4. **接受客户端连接**5. **连接服务器**6. **发送数据**7. **接收数据**8. **发送数据&#xff08;UDP&#xff09;**9. **接收数据&#xff08;UDP&#xff09;**10. **关闭Socket**11. **设置/获取Socket选…...

系统思考—啤酒游戏经营决策沙盘模拟

再次感谢文华学院的邀请&#xff0c;为经纬集团管理层带来 《啤酒游戏经营决策沙盘》&#xff01; 很多朋友问&#xff1a;“最近是不是啤酒游戏上的少了&#xff1f;” 其实&#xff0c;真正的关键不是游戏本身&#xff0c;而是——如何让大家真正看见复杂系统中的隐性结构。 …...

利用设计模式构建事件处理系统

在现代软件开发中&#xff0c;设计模式提供了一种可重用的解决方案来解决常见的设计问题。在这篇博客中&#xff0c;我们将探讨如何利用模板方法模式、责任链模式、建造者模式以及线程安全设计来构建一个灵活且可扩展的事件处理系统。 设计模式及其应用 1. 模板方法模式 应用…...

ThreadLocal 的详细使用指南

一、ThreadLocal 核心原理 ThreadLocal 是 Java 提供的线程绑定机制&#xff0c;为每个线程维护变量的独立副本。其内部通过 ThreadLocalMap 实现&#xff0c;每个线程的 Thread 对象都有一个独立的 ThreadLocalMap&#xff0c;存储以 ThreadLocal 对象为键、线程局部变量为值…...

全员DeepSeek时代,前端能做些什么?

全员DeepSeek时代&#xff0c;前端能做些什么&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…...

阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024

阿里云AI搜索产品荣获Elastic Innovation Award 2024&#xff0c;该奖项于近日在新加坡ElasticON 2025的Elastic合作伙伴峰会上颁发&#xff0c;旨在表彰基于Elastic平台开发企业级生成式人工智能&#xff08;GenAI&#xff09;应用的顶尖合作伙伴&#xff0c;这些应用有效帮助…...

html5制作2048游戏开发心得与技术分享

2048游戏开发心得与技术分享 这里写目录标题 2048游戏开发心得与技术分享项目概述技术架构1. 核心技术栈2. 项目结构 核心功能实现1. 数据结构设计2. 移动逻辑实现3. 触摸支持 性能优化1. DOM操作优化2. 事件处理优化 开发心得1. 代码组织2. 调试技巧3. 用户体验优化 项目亮点技…...

AI日报 - 2025年3月21日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | OpenAI成立安全委员会&#xff0c;加速AGI治理框架构建 ▎&#x1f4bc; 商业动向 | 微软发布医疗大模型DAX Copilot 3.0&#xff0c;覆盖全球临床场景 ▎&#x1f4dc; 政策追踪 | 中国发布…...

MyBatis-Plus:告别手写 SQL 的高效之道

目录 1. MyBatis-plus 简介 2. MyBatis-Plus 快速上手 2.1 项目准备 2.2 导入 MyBatis-Plus 依赖 2.3 配置数据库连接 2.4 配置 MyBatis-Plus 日志打印 3. 使用 MyBatis-Plus 3.1 创建 model 类 3.2 创建 mapper 接口 3.3 MyBatis-Plus 映射机制 3.3.1 TableName &a…...

【AI News | 20250320】每日AI进展

AI Repos 1、servers 该仓库提供详细入门指南&#xff0c;用户可通过简单步骤连接Claude客户端&#xff0c;快速使用所有服务器功能。此项目由Anthropic管理&#xff0c;展示MCP的多样性与扩展性&#xff0c;助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…...

让“树和二叉树”埋在记忆土壤中--性质和概念

Nice to meet your! 目录 树的介绍&#xff1a; 树的创建&#xff1a; 二叉树的概念和结构&#xff1a; 二叉树的存储结构&#xff1a; 树的介绍&#xff1a; 概念和结构&#xff1a; 不知你们是否在现实中看见过分为两个叉的枯树&#xff0c;大概长这样&#xff1a; 那…...

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系&#xff0c;找到入度为0的点作为起始遍历点。之后每遍历到这个点之后&#xff0c;就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时&#xff0c;继续被加入其…...

【Linux篇】进程控制

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 1. 进程创建 1.1 fork函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个…...

freeswitch(在呼叫失败的情况下如何播放语⾳提⽰)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch⼀般我们在打电话时会听到『您拨的电话正在通话中,请稍后再 拨.』,或『电话⽆应答』之类的提⽰,我们在 FreeSWITCH ⾥也可以这样做。 …...