小白,昨天平多多下单了个 ns2,有没有啥游戏和外设推荐的?
平多多原价 3350 ,花 68 买了个 v3 会员,可以满 2000 减 200 ,最终 3150 买到了东南亚版+捆绑的马里奥赛车。
新人入坑掌机,有没有大佬推荐下需要买写啥配套的装备吗?比如什么膜,壳,遥感帽等?我想买个屏幕在出租屋玩有推荐的嘛?最好是不要太大,搬家要方便的那种
有没有啥游戏推荐的?我 b 站简单看了看,想入手 2077 (没玩过),还有那个🦍的游戏。宝可梦以前在朋友机器上玩过,感觉不好玩。塞尔达也玩过还可以。
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
平多多原价 3350 ,花 68 买了个 v3 会员,可以满 2000 减 200 ,最终 3150 买到了东南亚版+捆绑的马里奥赛车。
新人入坑掌机,有没有大佬推荐下需要买写啥配套的装备吗?比如什么膜,壳,遥感帽等?我想买个屏幕在出租屋玩有推荐的嘛?最好是不要太大,搬家要方便的那种
有没有啥游戏推荐的?我 b 站简单看了看,想入手 2077 (没玩过),还有那个🦍的游戏。宝可梦以前在朋友机器上玩过,感觉不好玩。塞尔达也玩过还可以。
在网络活动日益频繁的当下,无论是排查网络故障、验证代理设置,还是判断网络请求来源,个人用户常常需要查询某个IP地址的地理位置和运营商信息。快速、准确、易用,无疑是大家对这类查询工具的核心诉求。 在深入探讨查询方法之前,我们要了解IP地理定位的精度是分层次的,据相关网络测量研究显示,在国家级别的定位准确率能达到92% - 99%,然而到了城市级(50公里范围内),准确率就会下降至50% - 75%左右。这背后有几个关键因素: 普通家庭宽带大多采用动态IP,若数据库未能及时更新,显示的可能是该IP池的注册地址,比如市级总公司的地址,而非用户实际位置。 移动端用户常处于大内网环境,出口IP可能归属于省公司,进而造成定位偏差。 免费的公开数据库可能几个月才更新一次,而像IP数据云这样的商业库能做到24小时快速更新,数据时效性更强。 明白了上述原理,下面我为大家介绍三种个人查询IP的实操方法: 打开IP 数据云查询页,输入目标 IP,一键获取国家、省份、城市、运营商、IP 类型等信息。 市面上还有一些公共工具,如IPinfo.io、IP-api等。不过,这类工具更适合临时简单使用,在准确性和数据丰富度上可能稍逊一筹。 对于有一定技术基础的用户,可以使用系统命令进行查询。Windows 运行cmd执行ping + 域名,获取 IP,再用tracert辅助判断线路与运营商,适合有基础的用户快速核验。 准确度易用性适合用户普通免费工具一般高临时简单查询系统命令查询较低低有技术基础用户IP数据云查询高极高所有个人用户 总之,个人用户查询 IP 地理位置与运营商,优先选免费、准确、无广告工具。网页查询省心,命令行适合快速核验,我个人使用下来IP数据云这样的专业平台,为用户提供可靠的IP查询服务,满足日常网络排查、安全验证、信息核验等多种需求,是个人用户值得信赖的IP查询工具。
一、为何查询的IP有时会“漂移”到隔壁省?
1. IP动态分配问题
2. 运营商NAT技术的影响
3. 数据库更新频率
二、个人查询IP的三种实操方法
1. 在线网页查询(最简单)
2. 普通免费工具查询
3. 系统命令查询
第一步:打开命令提示符(CMD)
第二步:用 ping 命令获取域名对应的IPping+域名
示例:ping www.baidu.com
执行后,中括号里的就是目标 IP。
第三步:用 tracert 辅助判断线路与运营商tracert IP
第四步:由于CMD 只能粗略判断,可以用免费工具精准确认。三、IP查询方案对比方案
方案 准确度 易用性 适合用户 普通免费工具 一般 高 临时简单查询 系统命令查询 较低 低 有技术基础用户 IP数据云查询 高 较高 所有个人用户 四、查询小贴士
从「AI For What」到「Value From AI」,100+可落地实践案例打通 AI 实战最后一公里! 4 月 16 日-4 月 18 日,QCon 全球软件开发大会将在北京举办。本届大会锚定 Agentic AI 时代的软件工程重塑,聚焦 Agentic AI、多智能体协作、算力优化、技术债治理、多模态和 AI 原生基础设施等前沿话题,邀请来自腾讯、阿里、百度、华为、蚂蚁、小米、网易等企业技术专家,带来百余项真实落地案例,系统性分享前沿洞察与实战干货,以技术共创探索 AI 落地新路径。 ElasticElastic 社区首席布道师刘晓国已确认出席 “Agentic Engineering” 专题,并发表题为《Elastic MCP 及 Agentic AI:构建可信、上下文感知能力的搜索》的主题分享。随着不断的研发探索,Elasticsearch 正从搜索引擎进化为 Agentic AI 的核心基础设施。本次分享将讨论如何用 Elasticsearch 为 Agentic AI 提供可用、可验证的上下文。通过 MCP,LLM 可按需访问企业数据与外部工具;结合向量/混合检索与对话历史记忆存储,检索结果可作为后续推理输入,从而减少因上下文缺失导致的错误回答。演讲还将介绍基于 Elastic 9.2 版本的 Agent Builder 与 9.3 版本的 Workflow:使用 ES|QL 封装查询与统计分析工具,使用 MCP 接入其他工具,并用工作流将数据处理、分类、通知与 API 调用串联。包含自然语言查询与工具编排 Demo。 刘晓国,曾就职于新加坡科技,康柏电脑,通用汽车,爱立信,诺基亚,Linaro 非营利组织 (Linux for ARM),Ubuntu,Vantiq 等企业。从事过电脑设计,汽车电子,计算机操作系统,通信,云实时事件处理等行业。从爱立信开始、诺基亚、Ubuntu 到现在的 Elastic,刘晓国从事社区工作已经有将近 20 年的经历。他在本次会议的详细演讲内容如下: 演讲提纲 搜索市场演变 搜索的变迁 把企业数据提供给 Agent 是充满挑战的 智能体时代,搜索比以往任何时候都更相关 2. Elastic MCP Elastic MCP 服务器介绍 定制 MCP 服务器 Demo: 使用 Elastic MCP 及 定制 MCP 进行自然语言查询 3. AI Agents 什么是 Agents 为什么需要上下文工程 Agent builder 架构 Elastic Workflow 介绍 Demo:使用 AI Agent builder 创建 tools 及 Agents (包括 workflows) 这样的技术在实践过程中有哪些痛点? 智能体的开发对于很多开发者来说不是很容易。如何让开发者迅速地开发出高质量的智能更不容易。在智能体的开发者中,上下文工程显得非常重要。如果缺失精确的上下文,大模型所生成的工作流也不会完善。 演讲亮点 高效的向量搜索为智能体的构建提供语义相关的上下文 Elastic 提供一个可视化界面,在几分钟内迅速地创建智能体所需要的 tools 及 agents 使用方便,直接,快速的管道查询语言 ES|QL 来关联多个表格里的数据,丰富数据,为智能体提供更多的上下 提供 MCP,A2A 及 API 接口供应用扩展 听众收益 深入了解 Elasticsearch 的向量搜索原理,使用及长处 了解 AI Agent Builder 如何轻松创建 Agentic AI 除此之外,本次大会还策划了Agentic Engineering、多模态理解与生成的突破、记忆觉醒:智能体记忆系统的范式重塑与产业落地、具身智能与物理世界交互、Agent Infra 架构设计、AI 重塑数据生产与消费、AI 原生基础设施、AI 驱动的技术债治理、小模型与领域适配模型、大模型算力优化、Agent 可观测性与评估工程、AI for SRE等 20 多个专题论坛,届时将有来自不同行业、不同领域、不同企业的 100+资深专家在 QCon 北京站现场带来前沿技术洞察和一线实践经验。 更多详情可扫码或联系票务经理 18514549229 进行咨询。

mackbookpro m5pro 和 m5max 已发布,本人目前使用 m1max 64g ,有必要换个 14 寸的 pro 吗。
原因有以下几个,看下是否合理
另外 xdr 显示器 2w4 还是买 1w2 的,程序员需要这个显示器吗
脑肿瘤是严重威胁人类健康的疾病之一,其早期准确诊断对患者的治疗和预后至关重要。传统的脑肿瘤诊断主要依赖放射科医生的经验,通过CT、MRI等医学影像进行人工判读。然而,这种方法存在主观性强、工作量大、易受疲劳影响等问题。随着深度学习技术的快速发展,基于计算机视觉的医学影像分析为脑肿瘤的自动识别提供了新的解决方案。 本文介绍了一个基于YOLOv8目标检测算法的脑肿瘤识别系统,该系统能够自动检测和定位医学影像中的脑肿瘤区域,为临床诊断提供辅助支持。YOLOv8作为当前最先进的目标检测算法之一,以其出色的检测速度和精度,在医学影像分析领域展现出巨大的应用潜力。 脑肿瘤的早期发现和准确诊断对提高患者生存率具有重要意义。据统计,脑肿瘤的发病率逐年上升,且呈现年轻化趋势。传统的诊断方式存在以下局限性: 基于深度学习的脑肿瘤自动识别技术能够有效解决上述问题。通过训练神经网络模型,系统可以快速、准确地识别脑肿瘤区域,减轻医生工作负担,提高诊断效率。同时,该技术还可以作为辅助诊断工具,帮助医生发现可能被忽略的微小病灶,降低漏诊率。 在临床应用中,脑肿瘤识别系统可以广泛应用于: https://www.bilibili.com/video/BV1LJPKzBEbi/ 包含: 本项目使用脑肿瘤医学影像数据集进行模型训练和验证。数据集采用YOLO格式组织,包含训练集和验证集两部分。 数据集配置文件如下: 数据集具有以下特点: 数据集目录结构如下: 本项目基于YOLOv8算法构建了完整的脑肿瘤识别系统,主要工作包括以下几个方面: 系统整体架构如下图所示: 脑肿瘤识别是医学影像分析领域的重要研究方向,近年来取得了显著进展。 国外在脑肿瘤识别领域的研究起步较早,主要集中在以下几个方面: 国内在脑肿瘤识别领域的研究发展迅速,主要特点包括: 当前脑肿瘤识别技术呈现以下发展趋势: 将数据集放置在指定目录,确保目录结构与配置文件一致。 使用以下命令开始训练: 主要参数说明: 训练完成后,使用以下命令进行推理: 启动图形界面: 在界面中可以: 本项目在技术实现上具有以下亮点: 采用YOLOv8作为核心检测算法,该算法具有以下优势: 实现了完整的数据处理流水线: 采用先进的训练优化方法: 开发了直观易用的图形界面: 系统设计具有良好的可扩展性: 从多个维度优化系统性能: 本文介绍了一个基于YOLOv8的脑肿瘤识别系统,该系统通过深度学习技术实现了对医学影像中脑肿瘤的自动检测和定位。项目从数据集构建、模型训练、系统集成到性能评估,形成了完整的解决方案。 系统的主要优势包括: 未来工作可以从以下几个方面展开: 基于深度学习的脑肿瘤识别技术为医学影像分析提供了新的思路和方法,随着技术的不断发展和完善,必将在临床诊断中发挥越来越重要的作用,为提高脑肿瘤诊断效率和准确性做出贡献。基于YOLOv8的脑肿瘤识别(中英文双版) | 附完整源码与效果演示
引言

背景意义

项目视频展示

📦完整项目源码
📦预训练模型权重
🗂️数据集项目详细效果展示


数据集信息
path: main/datasets
train: images/train
val: images/val
# 类别
names:
0: 阴性
1: 阳性main/datasets/
├── images/
│ ├── train/ # 训练集图片
│ └── val/ # 验证集图片
├── labels/
│ ├── train/ # 训练集标注
│ └── val/ # 验证集标注
└── brain-tumor.yaml # 数据集配置文件本项目主要工作
1. 数据集构建与预处理
2. 模型训练与优化
3. 系统集成与部署
4. 性能评估与验证
国内外研究现状
国外研究现状

国内研究现状

技术发展趋势
快速开始-部署指南
环境要求
安装步骤
git clone [项目地址]
cd braintumorconda create -n braintumor python=3.8
conda activate braintumorpip install -r requirements.txt模型训练
python main/train.py --data main/datasets/brain-tumor.yaml --epochs 100 --batch 16--data:数据集配置文件路径--epochs:训练轮数--batch:批次大小--imgsz:输入图像尺寸--device:训练设备(cpu或cuda)模型推理
python main/predict.py --weights best.pt --source test_images/系统使用
python youi/main.py
技术亮点
1. 先进的算法架构
2. 完善的数据处理流程
3. 高效的训练策略
4. 友好的用户界面
5. 可扩展的系统架构
6. 全面的性能优化
总结
大家好,我是 在数据驱动决策的时代,每个企业和个人都渴望快速从数据中挖掘价值,但复杂的 SQL 语句、繁琐的数据库操作却成了横亘在多数人面前的高墙。 今天,给大家介绍一款基于大模型和 RAG 的智能问数系统,通过对话分析数据,告别复杂 SQL! 功能特色: 工作原理: 1、拉取镜像 2、创建挂载目录 3、运行容器 4、容器启动成功后,浏览器访问 1、进入后台系统管理,选择 AI 模型配置,点击添加模型 2、选择好模型供应商后,输入模型名称、模型、API Key 等配置信息 3、最后,点击保存 1、打开首页,选择数据源,点击新建数据源 2、选择好数据源后,输入数据源连接信息,点击校验 3、数据源配置信息校验通过后,点击下一步,选择数据表 4、最后,点击保存 1、首页智能问数,点击开启问数 2、选择数据源,并确定 3、在对话框中输入描述,开始生成图表信息 1、首页仪表盘,点击新建仪表盘 2、选择要展示的图表 3、同时支持富文本、Tab设计 4、最后,预览并保存 无论你是需要快速生成报表的业务人员、追求效率的分析师,还是希望为系统赋能的开发者, 推荐的开源项目已经收录到 或者访问网站,进行在线浏览: 我创建了一个开源项目交流群,方便大家在群里交流、讨论开源项目。 但是任何人在群里打任何广告,都会被 T 掉。 如果你对这个交流群感兴趣或者在使用开源项目中遇到问题,可以通过如下方式进群: 关注微信公众号:【Java陈序员】,回复【开源项目交流群】进群,或者通过公众号下方的菜单添加个人微信,并备注【开源项目交流群】,通过后拉你进群。Java陈序员。关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。
项目介绍
SQLBot —— 一款基于大模型和 RAG 的智能问数系统,是对话式数据分析神器。它通过结合大模型与 RAG(检索增强生成)技术,实现了高质量的文本转 SQL 功能。

快速上手
SQLBot 支持 Docker 部署,可使用 Docker 快速部署。docker pull dataease/sqlbotmkdir -p /data/software/sqlbot/{excel,file,images,logs,postgresql}docker run -d \
--name sqlbot \
--restart unless-stopped \
-p 8000:8000 \
-p 8001:8001 \
-v /data/software/sqlbot/excel:/opt/sqlbot/data/excel \
-v /data/software/sqlbot/file:/opt/sqlbot/data/file \
-v /data/software/sqlbot/images:/opt/sqlbot/images \
-v /data/software/sqlbot/logs:/opt/sqlbot/app/logs \
-v /data/software/postgresql:/var/lib/postgresql/data \
--privileged=true \
dataease/sqlbothttp://{IP/域名}:8080adminSQLBot@123456功能体验
SQLBot 开启问数功能需要先配置 AI 模型和数据源。AI 模型配置


数据源配置



智能问数



仪表盘
SQLBot 还提供了仪表盘的功能,可以将智能问数产生的图表自定义刻制成仪表盘。



SQLBot 都能成为你的得力助手。快去部署体验吧~项目地址:https://github.com/dataease/SQLBot最后
GitHub 项目,欢迎 Star:https://github.com/chenyl8848/great-open-source-projecthttps://chencoding.top:8090/#/
大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!
个人网站或博客启用HTTPS无需复杂流程和高额成本,仅需3步即可通过免费SSL证书完成全链路加密升级,且能通过注册码解锁专属权益、获取技术支持。这不仅可避免浏览器标记“不安全”提示,还能提升搜索引擎排名权重,让访客更放心浏览内容。 验证域名所有权:目前主流CA服务商提供两种验证方式,建议优先选择DNS验证: 选择证书格式:证书签发完成后,根据服务器环境下载对应格式文件:第一步:前期准备与域名验证
.well-known/pki-validation/文件夹内,确认文件可通过外网访问。第二步:下载证书文件与适配服务器
cert.pem和private.key文件)。第三步:部署证书与优化配置
private.key复制粘贴至“密钥(KEY)”输入框,cert.pem粘贴至“证书(PEM)”输入框,勾选“强制HTTPS”后点击保存,网站将自动切换至HTTPS协议。/etc/nginx/conf.d/目录),添加以下配置:nginx
server {
listen 80;
server_name 你的域名;
return 301 https://$server_name$request_uri; # 强制跳转HTTPS
}
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1.2 TLSv1.3; # 启用安全TLS协议
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
}
执行`nginx -t`验证配置文件语法正确后,重启Nginx服务生效。
公司网络要求修改本地 Mac 地址,小米拓展坞连接后使用
sudo ifconfig enxx down
sudo ifconfig enxx ether Mac 地址
报 network is down
问下各位彦祖想要修改 Mac 地址如何修改啊!
国密SSL证书,全称是采用国密算法实现SSL/TLS协议功能的数字证书 。 这里的“国密”即国家密码管理局认定的国产商用密码算法。它并非对国际标准的简单模仿,而是一套由中国自主研发、具备自主知识产权的密码算法体系,主要包括 : 简单来说,国密证书就是使用了中国自己的密码算法(SM系列)来为网站传输数据加解密的数字证书 。 我们通常所说的“普通证书”,指的是采用国际通用算法(如RSA、ECC)的SSL证书。两者之间的区别主要体现在以下几个方面: 国密SSL证书绝非普通SSL证书的简单替代品,它是我国在网络空间实现“自主可控、安全可信”战略的核心载体 。虽然目前在兼容性上仍需通过“双证书”策略过渡,但其更高的安全强度和符合国家法规的合规属性,已成为政企及关键基础设施网站的必然选择。 如果您正面临国密合规改造,或希望提前布局更安全的加密体系,不妨了解一下 JoySSL,为您的网站筑起一道坚固的“中国盾牌”。一、什么是国密证书?

二、国密证书与普通证书的核心区别
对比维度 国密SSL证书 普通SSL证书(国际算法) 核心算法 采用中国自主的SM2/SM3/SM4算法体系 。 采用国际通用的RSA/ECC/SHA算法体系。 秘钥安全 更高强度。例如,256位的SM2算法,其安全强度相当于3072位的RSA算法,运算效率更高,抗攻击性更强。 依赖密钥长度扩展(如2048位RSA),面对量子计算的威胁,风险日益增加。 自主可控 完全自主可控。由国内CA机构签发,根证书掌握在自己手中,能有效防范“后门”风险和技术制裁 。 技术根基在海外,根证书由国外机构掌握,在极端情况下存在被吊销或断供的风险 。 兼容性 生态闭环。在通用的Chrome、Edge等浏览器上默认不信任,需使用360国密浏览器、红莲花等支持国密的专用浏览器访问。 全球通用。预置于几乎所有主流浏览器和操作系统中,全球用户均可无感知访问 。 合规性 合规必选。满足《密码法》、等保2.0、密评等国家法规的强制要求,是政府、金融、能源等关键基础设施领域的“必答题” 。 通用选择。适用于无强制合规要求的商业场景及跨国业务 。 三、为什么推荐JoySSL?
国密SSL证书申请入口
结语
很奇怪,每次在梦境中如果跟人起了争执,发生肢体冲突时总是有力无处使,全力一个大耳巴子挥过去却打不到人,一点也不爽.
昨天的事情:梦中在跟朋友吃宵夜,可能上厕所时碰到了隔壁桌,被找茬,对方从背后给了我一脚,我转身加入战斗,然后左一拳右一拳就是打不着,就很气,然后就结束了.
网上有很多做梦时无法无天的例子,什么弹指间毁天灭地那种,所以这是不是和平日里的下意识培养有关系?
武斗技巧?心理素质?
1 、上次应该追溯到一年前了,本来以为是眼睛疾病。
2 、昨天下班回家一觉醒来眼睛好多了。本来以为是手部沾染了病毒碰到,今早还没碰眼睛。结果今早刚坐入办公室半小时,眼睛又开始疼了。然后就是充满血丝,有点恐怖。
之前 2 站找佬要了个 l 站邀请码,也是水到 3 级了 再放个邀请码吧
invites/RJmJRzUsTg
AI 时代,感觉 Token 成了硬通货。只要用 AI 就离不开 Token 。不管是自己,还是公司层面,都要求采购 AI 。大家有哪些好用的 Token 渠道?
关于同步/异步,阻塞/非阻塞,Unix IO模型,可以先看这篇文章网络系统 - Unix IO模型 阻塞式IO。也就是说io没有就绪的时候,操作IO当前线程会被阻塞。也就是用户线程需要等待IO线程完成 服务器实现模式为一个连接一个线程,也就是说,客户端每当有一个连接请求的时候,服务器就需要启动一个对应线程进行处理。但是如果这个连接不做任何事情,就会造成不必要的线程开销。这种模型一般适用于连接数目小且固定的架构。 BIO 其实就是 Reactor的 单reactor 单进程/线程模型 上面说的情况是服务器只有一个线程的情况,那么我们就能想到使用多线程技术来解决这个问题: 如下图所示: 这种方式其实就是Reactor 的 单reactor 多线程/多进程模型,同样有是有局限性的,因此也就有了后文的NIO方案: BIO的问题关键不在于是否使用了多线程(包括线程池)处理这次请求,而在于accept()、read()的操作点都是被阻塞。要测试这个问题,也很简单。这里模拟了20个客户端(用20根线程模拟),利用JAVA的同步计数器CountDownLatch,保证这20个客户都初始化完成后然后同时向服务器发送请求,然后观察一下Server这边接受信息的情况。 经过执行就会发现,服务器一次只能处理一个客户端请求,当处理完成并返回后(或者异常时),才能进行第二次请求的处理。这就是上面提到的BIO存在的问题 客户端代码和上文一样,最主要是更改服务器端的代码: 这里与单线程相比,使用了多线程来处理具体的业务。但还是改变不了.accept()只能一个一个阻塞处理 socket的情况 那么重点的问题并不是“是否使用了多线程”,而是为什么accept()、read()方法会被阻塞。 API文档中对于 serverSocket.accept() 方法的使用描述: 这主要就涉及到阻塞式同步IO的工作原理: 服务器线程发起一个accept动作,询问操作系统 是否有新的socket套接字信息从端口X发送过来。accept源码如下: 注意,是询问操作系统。也就是说socket套接字的IO模式支持是基于操作系统的,那么自然同步IO/异步IO的支持就是需要操作系统级别的了。如下: 最后调用的accept0十个native方法,就是调用的操作系统级别的accept。因此如果操作系统没有发现有套接字从指定的端口X来,那么操作系统就会等待。这样serverSocket.accept()方法就会一直等待。这就是为什么accept()方法为什么会阻塞: 它内部的实现是使用的操作系统级别的同步IOBIO概述

BIO的问题
多线程方式 - 伪异步方式

cat /proc/sys/kernel/threads-max 命令查看可以创建的最大线程数。当然这个值是可以更改的,但是线程越多,CPU切换所需的时间也就越长,用来处理真正业务的需求也就越少。BIO通信方式深入分析
服务器端使用单线程
public class SocketClientDaemon {
public static void main(String[] args) throws Exception {
Integer clientNumber = 20;
CountDownLatch countDownLatch = new CountDownLatch(clientNumber);
//分别开始启动这20个客户端
for (int index = 0; index < clientNumber; index++) {
SocketClientRequestThread client = new SocketClientRequestThread(countDownLatch, index);
new Thread(client).start();
countDownLatch.countDown();
}
//这个wait不涉及到具体的实验逻辑,只是为了保证守护线程在启动所有线程后,进入等待状态
synchronized (SocketClientDaemon.class) {
SocketClientDaemon.class.wait();
}
}
}@Slf4j
public class SocketClientRequestThread implements Runnable {
private CountDownLatch countDownLatch;
//线程编号
private Integer clientIndex;
/**
* countDownLatch是java提供的同步计数器。
* 当计数器数值减为0时,所有受其影响而等待的线程将会被激活。这样保证模拟并发请求的真实性
*
* @param countDownLatch
*/
public SocketClientRequestThread(CountDownLatch countDownLatch, Integer clientIndex) {
this.countDownLatch = countDownLatch;
this.clientIndex = clientIndex;
}
@Override
public void run() {
Socket socket = null;
OutputStream clientRequest = null;
InputStream clientResponse = null;
try {
socket = new Socket("localhost", 83);
clientRequest = socket.getOutputStream();
clientResponse = socket.getInputStream();
//等待,直到SocketClientDaemon完成所有线程的启动,然后所有线程一起发送请求
this.countDownLatch.await();
//发送请求信息
clientRequest.write(("这是第" + this.clientIndex + " 个客户端的请求。").getBytes());
clientRequest.flush();
//在这里等待,直到服务器返回信息
log.info("第{}个客户端的请求发送完成,等待服务器返回信息", this.clientIndex);
int maxLen = 1024;
byte[] contextBytes = new byte[maxLen];
int realLen;
String message = "";
//程序执行到这里,会一直等待服务器返回信息(注意,前提是in和out都不能close,如果close了就收不到服务器的反馈了)
while ((realLen = clientResponse.read(contextBytes, 0, maxLen)) != -1) {
message += new String(contextBytes, 0, realLen);
}
log.info("接收到来自服务器的信息:{}", message);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
try {
if (clientRequest != null) {
clientRequest.close();
}
if (clientResponse != null) {
clientResponse.close();
}
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
}@Slf4j
public class SocketServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(83);
try {
while (true) {
//这里会被阻塞,直到能获取到连接
Socket socket = serverSocket.accept();
//下面开始收取信息
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
//获取端口
Integer sourcePort = socket.getPort();
int maxLen = 2048;
byte[] contextBytes = new byte[maxLen];
//这里会被阻塞,直到有数据准备好
int realLen = in.read(contextBytes, 0, maxLen);
//读取信息
String message = new String(contextBytes, 0, realLen);
//打印信息
log.info("服务器收到来自于端口: {}的信息: {}", sourcePort, message);
Thread.sleep(10000);//模拟执行业务逻辑
//开始发送信息
out.write("回发响应信息!".getBytes());
//关闭
out.close();
in.close();
socket.close();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
if (serverSocket != null) {
serverSocket.close();
}
}
}
}优化服务器端为多线程
@Slf4j
public class SocketServer {
static {
BasicConfigurator.configure();
}
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(83);
try {
while (true) {
Socket socket = serverSocket.accept();
//业务处理过程可以交给一个线程(这里可以使用线程池),并且线程的创建是很耗资源的。
//但最终还是改变不了.accept()只能一个一个接受socket的情况,并且被阻塞的情况
SocketServerThread socketServerThread = new SocketServerThread(socket);
new Thread(socketServerThread).start();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
if (serverSocket != null) {
serverSocket.close();
}
}
}
}
@Slf4j
class SocketServerThread implements Runnable {
private Socket socket;
public SocketServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream in = null;
OutputStream out = null;
try {
//下面收取信息
in = socket.getInputStream();
out = socket.getOutputStream();
Integer sourcePort = socket.getPort();
int maxLen = 1024;
byte[] contextBytes = new byte[maxLen];
//使用线程,同样无法解决read方法的阻塞问题,
//也就是说read方法处同样会被阻塞,直到操作系统有数据准备好
int realLen = in.read(contextBytes, 0, maxLen);
//读取信息
String message = new String(contextBytes, 0, realLen);
log.info("服务器收到来自于端口: " + sourcePort + "的信息: " + message);
Thread.sleep(10000);//模拟执行业务逻辑
//下面开始发送信息
out.write("回发响应信息!".getBytes());
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
//关闭资源
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
if (this.socket != null) {
this.socket.close();
}
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
}问题根源
Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.
翻译一下:监听与此套接字的连接并接受它。该方法会一直阻塞,直到建立连接为止。// java.net.ServerSocket#accept
public Socket accept() throws IOException {
if (isClosed())
throw new SocketException("Socket is closed");
if (!isBound())
throw new SocketException("Socket is not bound yet");
Socket s = new Socket((SocketImpl) null);
implAccept(s);//显然会走到这个逻辑
return s;
}
//java.net.ServerSocket#implAccept(java.net.Socket)
protected final void implAccept(Socket s) throws IOException {
SocketImpl si = s.impl;
// Socket has no SocketImpl
if (si == null) {//上面传进来的null
si = implAccept();
s.setImpl(si);
s.postAccept();
return;
}
//...省略
s.postAccept();
}
//java.net.ServerSocket#implAccept()
private SocketImpl implAccept() throws IOException {
if (impl instanceof PlatformSocketImpl) {
return platformImplAccept();
} else {
//...省略
}
}
//java.net.ServerSocket#platformImplAccept
private SocketImpl platformImplAccept() throws IOException {
assert impl instanceof PlatformSocketImpl;
// create a new platform SocketImpl and accept the connection
SocketImpl psi = SocketImpl.createPlatformSocketImpl(false);
implAccept(psi);
return psi;
}
//java.net.ServerSocket#platformImplAccept
private void implAccept(SocketImpl si) throws IOException {
assert !(si instanceof DelegatingSocketImpl);
// accept a connection
impl.accept(si);
//...省略
}
//java.net.AbstractPlainSocketImpl#accept
protected void accept(SocketImpl si) throws IOException {
si.fd = new FileDescriptor();
acquireFD();
try {
socketAccept(si);
} finally {
releaseFD();
}
SocketCleanable.register(si.fd, true);
}// java.net.PlainSocketImpl#socketAccept
void socketAccept(SocketImpl s) throws IOException {
int nativefd = checkAndReturnNativeFD();
if (s == null)
throw new NullPointerException("socket is null");
int newfd = -1;
InetSocketAddress[] isaa = new InetSocketAddress[1];
if (timeout <= 0) { //如果没有设置timeout,那么在调用JNI时会一直等待,直到有数据返回
newfd = accept0(nativefd, isaa);//这是个JNI方法
} else {
configureBlocking(nativefd, false);
try {
waitForNewConnection(nativefd, timeout);
newfd = accept0(nativefd, isaa);
if (newfd != -1) {
configureBlocking(newfd, true);
}
} finally {
configureBlocking(nativefd, true);
}
}
/* Update (SocketImpl)s' fd */
fdAccess.set(s.fd, newfd);
/* Update socketImpls remote port, address and localport */
InetSocketAddress isa = isaa[0];
s.port = isa.getPort();
s.address = isa.getAddress();
s.localport = localport;
if (preferIPv4Stack && !(s.address instanceof Inet4Address))
throw new SocketException("Protocol family not supported");
}
// java.net.PlainSocketImpl#accept0
static native int accept0(int fd, InetSocketAddress[] isaa) throws IOException;
朋友拜托我帮他写个人网站, 希望国内和国外都能良好访问. 我自己有博客, 之前回国出差的时候发现就算没被 ban 也访问巨慢. 自己博客无所谓, 帮朋友写毕竟拿钱的所以希望做好. 没用过国内相关服务, 所以想问下有经验的大佬如何正常在国内访问. 服务器想买国外的, 域名是 dynadot 买的. 目前有下面的想法, 不知道可行与否.
此外, 也想问下这种程度的活儿人工费通常是怎么算的呢 (朋友有钱, 让我按市场价算).
如果高还原的 figma 转前端代码,接了一个小项目,但是 figma make ai 或者 codex mcp 都还原不好,高价有偿请教专家 寻求经验
qq 1072505283
是这样子。
本来孩子 3 个月。之前都是爱他美 半水解。
但我想,国产除了正常思维习惯,很多人都会异口同声买进口。
但我们如果要从客观事实分析 ,国产奶粉真的会比国外进口的差吗?
如果要分析应该怎么分析。
娃是 12 月出生的,今天买了完达山,
但我纯粹是因为看销量不错,二,是国产。三,我看评论那么高。值得尝试。
但我还是不知道应该怎么客观去分析这个奶粉。