4.21总结

由于之前的项目没有使用服务器搭建,这两天进行了一些修改,以服务器为中端进行搭建,登录注册等功能从直接与数据库关联改为由服务器进行(直接关联只能在自己的端口进行修改,放在别人电脑上就无法进行)

顺遍了解了一下雪花算法(自增id且具有唯一性,通过位处理来得到想要获取的位数)

//初始化数据static {startTimeStamp = 1577808000000L;//设置机器编号 1workID = 1L;//设置数据中心ID 1dataCenterID = 1L;//起始序列号 0开始sequence = 0L;//数据中心位移位数dataCenterIndex = 12L;//机器ID位移位数workIDIndex = 17L;//时间戳位移位数timeStampIndex = 22L;//记录上次时间戳lastTimeStamp = -1L;//序列号长度sequenceLength = 12L;//序列号掩码sequenceMask = -1L ^ (-1L << sequenceLength);}public synchronized static long getID(){//获得当前时间long now = System.currentTimeMillis();//当前系统时间小于上一次记录时间if (now < lastTimeStamp){throw new RuntimeException("时钟回拨异常");}//相同时间 要序列号进制增量if (now == lastTimeStamp){//防止溢出sequence = (sequence + 1) & sequenceMask;if (sequence == 0L){//溢出处理try {Thread.sleep(1L);} catch (InterruptedException e) {throw new RuntimeException(e);}//获取下一毫秒时间 (有锁)now = System.currentTimeMillis();}}else{//置0 之前序列号同一时间并发后自增 到这里说明时间不同了 版本号所以置0sequence = 0L;}//记录当前时间lastTimeStamp = now;//当前时间和起始时间插值 右移 22位long handleTimeStamp = (now - startTimeStamp) << timeStampIndex;// 数据中心数值 右移动 17位 并且 按位或long handleWorkID = (dataCenterID << dataCenterIndex) | handleTimeStamp;// 机器ID数值 右移动 12位 并且 按位或long handleDataCenterID = (workID << workIDIndex) | handleWorkID;// 序列号 按位或long ID = handleDataCenterID | sequence;return ID;}

之前采用MD5对所有数据库的内容都进行了加密,修改之后只对密码进行加密

public static String encrypt(String plaintext) throws NoSuchAlgorithmException {// 使用 MD5 算法创建 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 更新 MessageDigest 对象中的字节数据md.update(plaintext.getBytes());// 对更新后的数据计算哈希值,存储在 byte 数组中byte[] digest = md.digest();// 将 byte 数组转换为十六进制字符串StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));}// 返回十六进制字符串return sb.toString();}

服务器进行数据库操作代码

(以添加为例)

String url = "jdbc:mysql://localhost:3306/chatroom";String root = "root";String word = "050710xxx";Connection conn = null;PreparedStatement pstmt = null;try {// 注册JDBC驱动Class.forName("com.mysql.cj.jdbc.Driver");// 打开连接System.out.println("Connecting to database...");conn = DriverManager.getConnection(url, root, word);// SQL插入语句String sql = "INSERT INTO clients (name,id,password,email,snowid) VALUES (?,?,?,?,?)";// 创建PreparedStatement对象pstmt = conn.prepareStatement(sql);// 设置参数pstmt.setString(1, name);pstmt.setString(2, id);pstmt.setString(3, password);pstmt.setString(4,email);pstmt.setLong(5,snowid);// 执行插入pstmt.executeUpdate();System.out.println("Data inserted successfully.");} catch (SQLException se) {// 处理JDBC错误System.out.println("在SbuildConst里面的add方法,出现重复注册或者没有写学号的问题");flag = 0;} catch (Exception e) {// 处理Class.forName错误System.out.println("出现主键错误3");flag = 0;e.printStackTrace();} finally {// 关闭资源try {if (pstmt != null) pstmt.close();} catch (SQLException se2) {}try {if (conn != null) conn.close();} catch (SQLException se) {flag=0;se.printStackTrace();}}System.out.println("End of program.");

还需要使用工具类作为表示,便于之后的使用

每次登录界面启用前,先打开服务端(最好进行分类,分别放在不同的两个项目中)

int port = 10086;try {ServerSocket serverSocket = new ServerSocket(port);System.out.println("等待客户端进行连接");while (true) {try {Socket socket = serverSocket.accept();System.out.println("连接客户端成功");new ServerThread(socket).start();} catch (IOException e) {System.out.println("已经下线了");serverSocket.close();break;}}} catch (IOException e) {System.out.println("Serve这个类除了问题");throw new RuntimeException(e);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubectl常用命令行介绍

1、kubectl用法概述 kubectl命令⾏的语法如下&#xff1a; $ kubectl [command] [type] [name] [flags] command&#xff1a;命令&#xff0c;用于操作Kubernetes集群资源对象的命令&#xff0c;例如create、delete、describe、get、apply等TYPE&#xff1a;资源对象的类型&am…

OpenHarmony UI开发-ohos-svg

简介 ohos-svg是一个SVG图片的解析器和渲染器&#xff0c;解析SVG图片并渲染到页面上。它支持大部分 SVG 1.1 规范&#xff0c;包括基本形状、路径、文本、样式和渐变,它能够渲染大多数标准的 SVG 图像。ohos-svg的优点是性能好、内存占用低。 效果展示 SVG图片解析并绘制: …

Python基本类型

1、Java基本类型 在java里&#xff0c;总共有8种基本类型&#xff0c;分别是&#xff1a; boolean&#xff1a;布尔类型&#xff0c;只有两个值true和false。char&#xff1a;字符类型&#xff0c;占用2个字节&#xff0c;用来表示一个单一的字符。byte&#xff1a;字节类型&…

uni-app HBuilderX通过easycom省略import自动导入自定义组件

快速尝试 自HBuilderX 2.5.5起支持easycom组件模式。更新HBuilderX即可尝试。 easycom默认已启用&#xff0c;并对项目下的components和uni_modules目录开启自动扫描&#xff0c;对符合下面路径和命名规则的组件自动导入。 components/组件名/组件名.vue uni_modules/组件名/…

使用飞桨快速部署stable diffusion模型

这可以说是最快的部署stable diffusion模型的方法了&#xff0c;而且星河社区还有免费的GPU算力提供&#xff0c;这样再也不用担心没有算力了&#xff01; 操作方法&#xff1a; # 安装相关库 pip install docarray0.21.0 pip install paddlehub# 初始化 from PIL import Imag…

踊跃参与,您有机会尊享300000水晶奖励!【AI书童】代言形象大投票活动开启~~~

【AI书童】运营官 未来智慧人工智能 2024-04-19 09:55 ✧ 快来选出你心目中的【AI书童】 ✦ 我们想为【AI书童】选择一个形象代言&#xff0c;使用【AI书童】软件生成了一部分形象照片。大家觉得哪个书童最合适呢&#xff1f;希望你们能给出宝贵的建议&#xff01; 【AI书童…

手把手教你实现 OceanBase 数据到 Apache Doris 的便捷迁移|实用指南

作者|SelectDB 技术团队 作为广受认可的分布式数据库&#xff0c;OceanBase 已在众多企业关键业务系统中得到广泛应用。在 Apache Doris 社区&#xff0c;有众多用户选择基于 OceanBase 与 Apache Doris 以构建强大的数据处理与分析链路&#xff0c;本文将详细介绍如何便捷高效…

在ts中const和readonly区别?

在TypeScript中&#xff0c;const和readonly是两种不同的属性修饰符&#xff0c;它们各自有特定的用途和语义。 const关键字在TypeScript中用于声明常量&#xff0c;即一个值在初始化后不能再被改变的变量。这意味着一旦你为一个const变量赋值&#xff0c;你就不能再次为它赋一…

Java反序列化-CC3链

前言 前面的CC1与CC6链都是通过 Runtime.exec() 进行命令执行的。当服务器的代码将 Runtime放入黑名单的时候就不能使用了。 CC3链的好处是通过动态加载类的机制实现恶意类代码执行。 版本限制 jdk8u65Commons-Collections 3.2.1 动态类加载 loadClass -> 负责加载load…

【数据结构】队列的使用方法

队列&#xff08;Queue&#xff09;是另一种基本的线性数据结构&#xff0c;它允许在一端进行插入操作&#xff0c;而在另一端进行删除操作。队列的特点是先进先出&#xff08;First In First Out, FIFO&#xff09;&#xff0c;即最先进入队列的元素最先被取出。 队列可以用数…

38. UE5 RPG 修改火球术的攻击方向以及按住Shift攻击

在前面&#xff0c;我们实现了火球术火球的制作&#xff0c;能够在释放火球术时&#xff0c;角色将播放释放技能动画&#xff0c;并实现了对火球的目标的服务器同步功能。 我们先回忆一下之前完成的内容。 在前面&#xff0c;我们先做了一个Actor&#xff0c;用于承载发射的火…

集成学习-Bagging与随机森林回归

reg_fRFR() reg_tDTR()#实例化决策树 cvKFold(n_splits5,shuffleTrue,random_state1412)#实例化验证方式 result_tcross_validate(reg_t#要进行交叉验证的评估器,X,y,cvcv,scoringneg_mean_squared_error#评估指标,return_train_scoreTrue#是否返回训练分数&#xff0c;后面这几…

高可用环境kafka消息未按顺序消费问题

目录 1、背景 2、问题排查 3、问题解决 1、背景 质检任务是异步执行&#xff0c;正常情况下任务状态扭转是 等待中》运行中》成功&#xff08;失败&#xff09;。在质量平台生成任务实例&#xff0c;此时状态是等待中&#xff0c;生成实例之后把具体的任务sql给到大数据平…

Git 原理及使用 (带动图演示)

文章目录 &#x1f308; Ⅰ Git 安装&#x1f319; 01. Linux - centos &#x1f308; Ⅱ Git 工作区、暂存区和版本库&#x1f319; 01. 认识工作区、暂存区和版本库&#x1f319; 02. 使用 Git 管理工作区的文件 &#x1f308; Ⅲ Git 基本操作&#x1f319; 01. 创建本地仓库…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式&#xff1a;doGet和doPost doGet&doPost 返回数据就是httpResponse&#xff0c;返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题&#xff0c;就会…

SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示 首先我们看一下layuimini的原有菜单显示格式 {"homeInfo": {"title": "首页","href": "page/welcome-2.html?t2"},"logoInfo": {"title": "LAYUI MINI","…

Thinkphp5+mysql批量筛选varchar字段默认值为null的数据

荆轲刺秦王 sql server数据库转mysql之后,遇到: CREATE TABLE q_bk_date (daid int(11) NOT NULL AUTO_INCREMENT,partno varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT ,Bdate date DEFAULT NULL,bkno varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT ,bvar varchar(…

ts中函数形状有几种定义方式

在TypeScript&#xff08;TS&#xff09;中&#xff0c;函数形状&#xff08;即函数的类型&#xff09;可以通过多种方式定义。以下是一些主要的定义方式&#xff1a; 类型别名定义函数形状&#xff1a; 使用 type 关键字为函数定义类型别名。 type MyFunction (a: number, …

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强&#xff08;主要是随机…

Java语言——封装

一.封装的定义 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问…