网站通信(二)
文章目录一、Socket 登录注册与数据库1.注册2.登录二、用 Spring Boot 重写 Web 后端三、登录、注册和消息接口四、Java 程序也可以发送 HTTP 请求五、长连接和短连接一、Socket 登录注册与数据库这次开始先把之前聊天室中没有真正完成的数据存储补上之前的账号信息大多保存在ArrayList或者其他内存对象中只要服务器关闭注册过的用户也就没有了。所以登录和注册最终还是需要接到数据库。这次数据库中先建立了一张用户表CREATEDATABASEchatdb;USEchatdb;CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)UNIQUENOTNULL,passwordVARCHAR(50)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);Socket 服务端仍然保持原来的结构ServerSocket ↓ accept() ↓ Socket ↓ ClientHandler每有一个客户端连接SocketsocketserverSocket.accept();newClientHandler(socket).start();都会创建一个ClientHandler单独处理这个客户端。这次没有继续使用前面比较复杂的字节协议而是把指令统一写成命令|参数1|参数2例如REGISTER|zhangsan|123456 LOGIN|zhangsan|123456 MSG|lisi|hello QUIT服务端收到后StringcmdLinedis.readUTF();String[]partscmdLine.split(\\|);然后根据第一个字段判断要执行什么功能switch(parts[0].toUpperCase()){caseREGISTER:handleRegister(parts);break;caseLOGIN:handleLogin(parts);break;caseMSG:handleMessage(parts);break;caseFILE:handleFile(parts);break;caseQUIT:logout();return;}这样比前面自己一位一位读取消息类型、用户名长度、消息长度要直观不少。1.注册注册时主要执行数据库插入PreparedStatementstmtconn.prepareStatement(INSERT INTO users(username, password) VALUES (?, ?));stmt.setString(1,user);stmt.setString(2,pass);stmt.executeUpdate();这里使用了PreparedStatement。之前如果直接拼 SQLSELECT * FROM users WHERE usernameusername参数一多比较容易出错使用*?*作为占位符再通过stmt.setString()填入真正的值2.登录登录则查询数据库PreparedStatementstmtconn.prepareStatement(SELECT * FROM users WHERE username? AND password?);如果查询到了记录说明账号密码正确。同时服务端还维护ConcurrentHashMapString,ClientHandleronlineUsers用来保存在线用户用户名 → ClientHandler用户登录成功后ChatServer.onlineUsers.put(user,this);退出时再移除ChatServer.onlineUsers.remove(username,this);这样既能判断一个账号是否已经在线也方便后面根据用户名找到对应连接并转发消息。二、用 Spring Boot 重写 Web 后端Socket 方式能够比较清楚地看到网络通信底层过程但写功能时需要自己处理很多东西。例如前面的程序需要自己处理监听连接 创建线程 读取流 拆消息协议 判断命令 返回结果这次开始使用 Spring Boot。创建项目以后加入了 Web 和 MySQL 等相关依赖然后一个接口可以直接写成RestControllerpublicclassLogin{GetMapping(/login)publicStringlogin(Stringname,Stringpwd){System.out.println(账号name 密码pwd);return登录成功;}}其中RestController表示这个类用来处理Web请求。GetMapping(/login)表示访问/login → 执行login()启动 Spring Boot 后直接访问http://localhost:8080/login?namezhangsanpwd123456Spring Boot 就会自动把name、pwd对应到方法参数。Spring Boot 已经把这些工作处理好了。真正需要自己写的主要变成收到什么参数 ↓ 执行什么业务 ↓ 返回什么结果三、登录、注册和消息接口1.注册接口GetMapping(/register)publicStringregister(Stringname,Stringpwd){for(Useruser:users){if(user.userName.equals(name)){return账号已存在;}}users.add(newUser(name,pwd));return注册成功;}2.登录GetMapping(/login)publicStringlogin(Stringname,Stringpwd){for(Useruser:users){if(user.userName.equals(name)){if(user.password.equals(pwd)){return登录成功;}return密码错误;}}return账号不存在;}还可以直接写GetMapping(/getAll)publicListUsergetAll(){returnusers;}查询所有用户。到了这里服务端功能实际上已经可以拆成多个独立地址/login /register /getAll /sendMsg /getMsg每一个地址负责一件事情。这种写法比所有消息先进同一个 Socket再根据协议自己判断属于哪个功能结构要简单很多。四、Java 程序也可以发送 HTTP 请求Web 服务端并不意味着客户端一定只能是浏览器Java 程序同样可以通过 HTTP 请求 Spring Boot。这次用到了HttpClientHttpRequestHttpResponse例如HttpClientclientHttpClient.newHttpClient();构造请求HttpRequestrequestHttpRequest.newBuilder().uri(URI.create(http://localhost:8080/login?namezhangsanpwd123456)).GET().build();发送HttpResponseStringresponseclient.send(request,HttpResponse.BodyHandlers.ofString());然后System.out.println(response.statusCode());System.out.println(response.body());就可以得到 Spring Boot 返回的结果。所以客户端虽然还是 Java 写的但连接方式已经从newSocket(...)变成了构造 HTTP 请求 ↓ 访问接口 ↓ 得到 HTTP 响应这就引出了这次比较重要的另一个问题Socket 长连接和 HTTP 短连接到底有什么区别五、长连接和短连接之前聊天室使用 Socket客户端一旦连接newSocket(...)连接通常就会一直保留。这种模式可以看成Client Server 一直连接只要连接还在服务端随时可以向客户端发送消息因此聊天的实时性很好。但是问题也很明显**连接本身需要资源。**如果在线用户特别多每一个客户端都需要保持 Socket还可能需要独立线程负责接收消息。假设大部分人都在线服务端就要同时维护大量连接任何一个人发送消息还需要再向其他大量客户端转发。如果简单按照for(...){send(...);}一个个发送人数多以后消息转发本身也会带来明显的压力。HTTP 的工作方式则不一样。一次请求基本是建立连接 ↓ 发送请求 ↓ 服务器处理 ↓ 返回响应 ↓ 请求结束服务端不能像之前的 Socket 一样在任意时间直接沿着原来的连接给客户端发消息所以它更接近一种短连接方式。这次比较下来两种方式各有特点。Socket 长连接优点 实时性高 服务端可以主动推送 适合即时通信 问题 需要一直维护连接 在线用户多时资源压力较大 并发处理更加复杂HTTP 短连接加轮询优点 接口开发简单 连接不需要一直保持 服务端业务结构清楚 问题 不能直接主动推送 需要客户端不断轮询 一定会有延迟

相关新闻

FanControl 风扇控制实战指南:5 步让深夜机箱安静下来

FanControl 风扇控制实战指南:5 步让深夜机箱安静下来

FanControl 风扇控制实战指南:5 步让深夜机箱安静下来 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…

2026/10/17 2:59:32 阅读更多 →
3分钟上手暗黑2存档编辑器:零基础修改角色属性与装备导入完整指南

3分钟上手暗黑2存档编辑器:零基础修改角色属性与装备导入完整指南

3分钟上手暗黑2存档编辑器:零基础修改角色属性与装备导入完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 如果有一款开源的暗黑2存档编辑器,能让修改存档像在游戏里点鼠标一样简单,你…

2026/10/17 3:43:48 阅读更多 →
Claude Code安装配置与实战指南:AI编程工具深度解析

Claude Code安装配置与实战指南:AI编程工具深度解析

如果你是一名开发者,最近一定在各种技术社区和社交媒体上看到过“Claude Code”这个名字。它被描述为“AI编程神器”、“代码生成新标杆”,甚至有人称之为“程序员效率革命”。但当你真正想去尝试时,却发现信息混乱:它到底是Claud…

2026/10/16 4:45:12 阅读更多 →

最新新闻

PyTorch模型跨框架部署:ONNX转TensorFlow实战与避坑指南

PyTorch模型跨框架部署:ONNX转TensorFlow实战与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 3:44:56 阅读更多 →
低成本AI短剧制作全流程:0.02元/秒成本控制与实操指南

低成本AI短剧制作全流程:0.02元/秒成本控制与实操指南

1. 低成本AI短剧的底层逻辑与方案选型1.1 为什么0.02元/秒这个数字值得认真对待第一次看到“0.02元/秒”这个报价的时候,我的反应跟大多数人一样:要么是引流噱头,要么就是有什么隐藏的坑。但实际跑完整个流程之后,我发现这个数字在…

2026/10/17 3:44:56 阅读更多 →
CentOS yum源报错排查:修复Cannot find valid baseurl的三种方案

CentOS yum源报错排查:修复Cannot find valid baseurl的三种方案

CentOS 的 yum 源报错,大概是 Linux 运维里出现频率最高的一类问题了。尤其是Cannot find a valid baseurl for repo: base这句,几乎每个用过 CentOS 7 的人都见过。我最近在整理一批退役虚拟机时又踩了一遍,处理过程中翻了不少资料&#xff…

2026/10/17 3:44:56 阅读更多 →
从零到发布:用TaoToken辅助完成VSCode插件开发全流程

从零到发布:用TaoToken辅助完成VSCode插件开发全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 3:44:56 阅读更多 →
hustoj源码深度解析:工业级在线判题系统架构与沙箱实现

hustoj源码深度解析:工业级在线判题系统架构与沙箱实现

简介:本资源为华中科技大学HUSTOJ在线评测系统最新源码(r2133版本),专为ACM/ICPC程序设计竞赛训练与教学场景设计,适用于高校算法教练、竞赛集训队及有自建OJ需求的开发者。压缩包共2000个文件,主体包含281…

2026/10/17 3:44:56 阅读更多 →
AI仿真凭什么敢信?代理模型原理、可信度验证与工程应用边界解析

AI仿真凭什么敢信?代理模型原理、可信度验证与工程应用边界解析

前阵子有位做结构设计的同行问我:AI仿真秒级出结果,你敢拿它直接下设计结论吗?这个问题问到了点子上。AI仿真这几年已经从“玩票”变成了CAE圈子里的热门话题,各家厂商都在推“实时仿真”“AI代理模型”“零阶降阶”的概念。但工程…

2026/10/17 3:43:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →