java socket 实现增删改查 + 在线答题小案例

实现效果

(1) 在client端可以实现对数据库的操作(Select,Insert,Update,Delete)
(2)数据库中创建一个考试表和学生表,考试表中问题是四项选择题(10道以上),client端做题,成绩存入学生表
(3)实现多个Client程序对server端的访问 Hint:Java程序中会使用多个class,server端使用thread监听多个client 。

一、创建数据库demo,数据表student、question。
其中student表存储了学生的姓名以及成绩记录、question表中存储了单项选择题的有关内容。

在这里插入图片描述
二、创建Student、Question 两个实体类
包含属性,Getter,Setter方法
Student.java

package com.jxnu.demo;/*** @author xiao*/
public class Student {//主键IDprivate Integer id;//用户名private String username;//分数private String grade;//生日public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}@Overridepublic String toString() {return "Student{" +"id=" + id +", username='" + username + '\'' +", grade=" + grade +'}';}
}

Question.java

package com.jxnu.demo;/*** @author xiao*/
public class Question {private Integer id;private String Content;private String OptionA;private String OptionB;private String OptionC;private String OptionD;private String answer;private String grade;public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getContent() {return Content;}public void setContent(String content) {Content = content;}public String getOptionA() {return OptionA;}public void setOptionA(String optionA) {OptionA = optionA;}public String getOptionB() {return OptionB;}public void setOptionB(String optionB) {OptionB = optionB;}public String getOptionC() {return OptionC;}public void setOptionC(String optionC) {OptionC = optionC;}public String getOptionD() {return OptionD;}public void setOptionD(String optionD) {OptionD = optionD;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}@Overridepublic String toString() {return "Question{" +"id=" + id +", Content='" + Content + '\'' +", OptionA='" + OptionA + '\'' +", OptionB='" + OptionB + '\'' +", OptionC='" + OptionC + '\'' +", OptionD='" + OptionD + '\'' +", answer='" + answer + '\'' +", grade='" + grade + '\'' +'}';}
}

三、导入jar包,编写三个与数据库相关的Java Class,DbManage、
StudentDao和QuestionDao。

其中DbManage有三个方法,initDB()负责打开驱动,两个close()方法分别关闭有结果集与无结果集。

DBManage.java

package com.jxnu.demo;import java.sql.*;/*** @author xiao*/
public class DbManage {//打开驱动public Connection initDB() {Connection conn = null;final String DRIVER_NAME = "com.mysql.jdbc.Driver";//数据库连接地址final String URL = "jdbc:mysql://localhost:3306/socket?useUnicode=true&characterEncoding=utf-8&useSSL=FALSE&serverTimezone=UTC";//用户名final String USER_NAME = "root";//密码final String PASSWORD = "";try {Class.forName(DRIVER_NAME);conn = DriverManager.getConnection(URL,USER_NAME,PASSWORD);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}//关闭无结果集public void closeDB(PreparedStatement pstmt, Connection con) {try {if(pstmt!=null) {pstmt.close();}if(con!=null) {con.close();}} catch (SQLException e) {e.printStackTrace();}}//关闭有结果集public void closeDB(ResultSet rs, PreparedStatement pstmt, Connection con) {try {if(pstmt!=null) {pstmt.close();}if(con!=null) {con.close();}if(rs!=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}
}

StudentDao.java
StudentDao负责有关学生信息的增删查改(insert、update、delete、findAll)

package com.jxnu.demo;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** @author xiao*/
public class StudentDao {/*** 添加* @param student* @return*/public boolean insert(Student student) {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;String sql = "insert into student(username,grade) VALUES(?,?)";boolean res = false;try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);pstmt.setString(1,student.getUsername());pstmt.setString(2,student.getGrade());res = (pstmt.executeUpdate() == 1);}catch (SQLException e) {e.printStackTrace();}finally {dbmanage.closeDB(pstmt, con);}return res;}/*** 删除* @param id* @return*/public boolean delete(Integer id) {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;String sql = "delete from student where id = ?";boolean flag = false;try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);pstmt.setInt(1, id);int result = pstmt.executeUpdate();if (result > 0) {flag = true;}} catch (Exception e) {e.printStackTrace();}finally {dbmanage.closeDB(pstmt, con);}return flag;}/*** 修改信息* @param student* @return*/public boolean update(Student student) {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;String sql = "update student set username=? where id= ?";boolean res = false;try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);pstmt.setString(1,student.getUsername());pstmt.setInt(2,student.getId());res = (pstmt.executeUpdate()==1);}catch (SQLException e) {e.printStackTrace();return false;}finally {dbmanage.closeDB(pstmt, con);}return res;}public boolean updateG(Student student) {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;String sql = "update student set grade=? where id= ?";boolean res = false;try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);pstmt.setString(1,student.getGrade());pstmt.setInt(2,student.getId());res = (pstmt.executeUpdate()==1);}catch (SQLException e) {e.printStackTrace();return false;}finally {dbmanage.closeDB(pstmt, con);}return res;}/*** 查找所有数据* @return*/public List<Student> findAll() {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;ResultSet rs = null;List<Student> list = new ArrayList<Student>();String sql = "select * from student";try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {Student student = new Student();student.setId(rs.getInt("id"));student.setUsername(rs.getString("username"));student.setGrade(rs.getString("grade"));list.add(student);}}catch (Exception e) {e.printStackTrace();}finally {dbmanage.closeDB(rs,pstmt, con);}return list;}/*** 根据ID查询* @param id* @return*/public List<Student> findById(Integer id) {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;ResultSet rs = null;//MessageEntity messageEntity = new MessageEntity();List<Student> list = new ArrayList<Student>();String sql = "select * from student where id=?";try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);pstmt.setInt(1, id);rs = pstmt.executeQuery();while(rs.next()){Student student = new Student();student.setId(rs.getInt("id"));student.setUsername(rs.getString("username"));student.setGrade(rs.getString("grade"));list.add(student);}}catch (Exception e) {e.printStackTrace();}finally {dbmanage.closeDB(rs,pstmt, con);}return list;}}

QuestionDao.java
QuestionDao负责有关题目的增删改查

package com.jxnu.demo;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** @author xiao*/
public class QuestionDao {public List<Question> findAll() {DbManage dbmanage = new DbManage();Connection con = null;PreparedStatement pstmt =null;ResultSet rs = null;List<Question> list = new ArrayList<Question>();String sql = "select * from question";try {con = dbmanage.initDB();pstmt = con.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {Question question = new Question();question.setId(rs.getInt("id"));question.setAnswer(rs.getString("answer"));question.setContent(rs.getString("content"));question.setOptionA(rs.getString("optionA"));question.setOptionB(rs.getString("optionB"));question.setOptionC(rs.getString("optionC"));question.setOptionD(rs.getString("optionD"));list.add(question);}}catch (Exception e) {e.printStackTrace();}finally {dbmanage.closeDB(rs,pstmt, con);}return list;}
}

三、编写StudentService类,用于处理增删改查以及答题的逻辑

package com.jxnu.demo;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;/*** @author xiao*/
public class StudentService{public void show(Socket socket) throws IOException {DataOutputStream out = new DataOutputStream(socket.getOutputStream());StudentDao dao = new StudentDao();List<Student> list = dao.findAll();out.writeUTF(String.valueOf(list));}public void insert(Socket socket) throws IOException {DataInputStream input = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream());out.writeUTF("请输入新增用户名");String username = input.readUTF();out.writeUTF("请输入用户成绩");String grade = input.readUTF();StudentDao dao = new StudentDao();Student student = new Student();student.setUsername(username);student.setGrade(grade);if(dao.insert(student))out.writeUTF("添加成功");elseout.writeUTF("添加失败");}public void delete(Socket socket) throws IOException {DataInputStream input = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream());out.writeUTF("请输入要删除的ID号");String id = input.readUTF();StudentDao dao = new StudentDao();if(dao.delete(Integer.valueOf(id)))out.writeUTF("删除成功");elseout.writeUTF("删除失败,请确认ID是否存在");}public void update(Socket socket) throws IOException {DataInputStream input = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream());out.writeUTF("请输入要修改的用户ID号");String id = input.readUTF();out.writeUTF("请输入修改后的用户名");String username = input.readUTF();StudentDao dao = new StudentDao();Student student = new Student();student.setId(Integer.valueOf(id));student.setUsername(username);if(dao.update(student))out.writeUTF("更新成功");elseout.writeUTF("更新失败");}public void answer(Socket socket) throws IOException {DataInputStream input = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream());QuestionDao questionDao = new QuestionDao();List<Question> questionList = questionDao.findAll();Question question = new Question();out.writeUTF(String.valueOf(questionList.size()));int n = questionList.size();//out.writeUTF("请输入题号");int sum = 0;String[] answers = new String[20];for(int i=0;i<n;i++){out.writeUTF("第"+(i+1)+"题"+":  "+questionList.get(i).getContent());out.writeUTF("A. " + questionList.get(i).getOptionA() + "\t"+ "B. " + questionList.get(i).getOptionB() + "\t"+ "C. " + questionList.get(i).getOptionC() + "\t"+ "D. " + questionList.get(i).getOptionD());answers[i]=input.readUTF();System.out.println(answers[i]);if(answers[i].equals(questionList.get(i).getAnswer())){out.writeUTF("回答正确,+10 分\n");sum += 10;}elseout.writeUTF("回答错误\n");}String id = input.readUTF();out.writeUTF("总成绩为"+sum);StudentDao dao = new StudentDao();Student student = new Student();student.setId(Integer.valueOf(id));student.setGrade(String.valueOf(sum));if (dao.updateG(student))out.writeUTF("成绩保存成功");elseout.writeUTF("成绩保存失败");}
}

四、编写Server类。
其中server端使用thread监听多个client,根据Client端的指令调用不同的方法并执行。收到指令“1”,执行StudentService中的show()方法,查询出学生表中所有的记录并返回给Client;收到指令“2”,执行StudentService中的insert()方法,获取客户端传来的姓名与成绩并插入student表中。收到指令“3”,执行update()方法,可以实现根据client端传来的ID号和新姓名实现修改姓名的功能;收到指令“4”,执行delete()方法,可以根据Client端传来的ID号实现删除学生记录的功能;收到指令“5”,实现答题功能,用户每回答一个题目,Server端判断正误并将结果返回给Client端,最后计算出总成绩存入student表;收到指令“0”,Client端将断开连接。

package com.jxnu.demo;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;/*** @author xiao*/
public class Server {public static final int PORT = 12345;//监听的端口号public static void main(String[] args) {System.out.println("服务器启动...\n");Server server = new Server();server.init();}public void init() {try {ServerSocket serverSocket = new ServerSocket(PORT);while (true) {// 一旦有堵塞, 则表示服务器与客户端获得了连接Socket client = serverSocket.accept();// 处理这次连接new HandlerThread(client);}} catch (Exception e) {System.out.println("服务器异常: " + e.getMessage());}}public static class HandlerThread implements Runnable {private Socket socket;public HandlerThread(Socket client) {socket = client;new Thread(this).start();}public void run() {try {// 读取客户端数据DataInputStream input = new DataInputStream(socket.getInputStream());String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException// 处理客户端数据System.out.println("客户端:" + clientInputStr);// 向客户端回复信息DataOutputStream out = new DataOutputStream(socket.getOutputStream());action(clientInputStr,socket);out.close();input.close();} catch (Exception e) {System.out.println("服务器 run 异常: " + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (Exception e) {socket = null;System.out.println("服务端 finally 异常:" + e.getMessage());}}}}public void action(String clientInputStr,Socket socket) throws IOException {DataOutputStream out = new DataOutputStream(socket.getOutputStream());StudentService studentService = new StudentService();switch (clientInputStr){case "1":studentService.show(socket);break;case "2":studentService.insert(socket);break;case "3":studentService.delete(socket);break;case "4":studentService.update(socket);break;case "5":studentService.answer(socket);break;case "0":out.writeUTF("OK");break;default:out.writeUTF("输入指令有误,请重新输入");}}}
}

六、编写Client类

package com.jxnu.demo;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;/*** @author xiao*/
public class Client {public static final String IP_ADDR = "192.168.19.133";//服务器地址public static final int PORT = 12345;//服务器端口号public static void main(String[] args) {System.out.println("客户端启动...");System.out.print("【提示】 1 表示查看所有学生信息, 2 表示添加学生信息, 3 表示删除学生信息, 4表示修改学生信息, 5表示做题, 0表示结束\n ");while (true) {Socket socket = null;try {//创建一个流套接字并将其连接到指定主机上的指定端口号socket = new Socket(IP_ADDR, PORT);//读取服务器端数据DataInputStream input = new DataInputStream(socket.getInputStream());//向服务器端发送数据DataOutputStream out = new DataOutputStream(socket.getOutputStream());System.out.println("请输入指令: \t");String str = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(str);String ret = input.readUTF();System.out.println("服务器端: " + ret);if("请输入要删除的ID号".equals(ret)) {String id = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(id);String result = input.readUTF();System.out.println(result);}if("请输入要修改的用户ID号".equals(ret)) {String id = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(id);System.out.println("服务器端: "+input.readUTF());String username = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(username);String result = input.readUTF();System.out.println(result);}if("请输入新增用户名".equals(ret)) {String username = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(username);System.out.println("服务端: " + input.readUTF());String grade = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(grade);String result = input.readUTF();System.out.println(result);}// 如接收到 "OK" 则断开连接if ("OK".equals(ret)) {System.out.println("客户端将关闭连接");Thread.sleep(500);break;}if (ret.length() <=3 ) {Integer n = Integer.valueOf(ret);System.out.println("总共" + n + "道题,每题10分,总分100分");for(int i=0;i<n;i++) {System.out.println(input.readUTF());System.out.println(input.readUTF());System.out.println("请输入答案: ");String answer = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(answer);System.out.println(input.readUTF());}System.out.println("请输入你的用户ID号");String id = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(id);String sum = input.readUTF();System.out.println(sum);String result = input.readUTF();System.out.println(result);}out.close();input.close();} catch (Exception e) {System.out.println("客户端异常:" + e.getMessage());} finally {if (socket != null) {try {socket.close();System.out.println("socket is closed");} catch (IOException e) {socket = null;System.out.println("客户端 finally 异常:" + e.getMessage());}}}}}
}

效果图
这里我还弄了点花里胡哨的颜色,有点好看嘿嘿。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

90后斯坦福博士论文登Science封面!AI算法准确预测RNA三维结构

来源&#xff1a;Science编辑&#xff1a;yaxin、su「我们对大部分RNA的结构几乎一无所知。」半个世纪以来&#xff0c;确定生物分子的三维结构一直困惑着科学家&#xff0c;也是生物学的重大挑战之一。难就难在&#xff0c;RNA折叠成复杂三维结构的形状很难通过实验或计算来确…

Event Recommendation Engine Challenge分步解析第五步

一、请知晓 本文是基于&#xff1a; Event Recommendation Engine Challenge分步解析第一步 Event Recommendation Engine Challenge分步解析第二步 Event Recommendation Engine Challenge分步解析第三步 Event Recommendation Engine Challenge分步解析第四步 需要读者先阅读…

计算机网络之RIP协议与OSPF协议模拟、UDP与TCP编程,Wireshark抓包分析

通过Python模拟RIP协议,OSPF协议,并模拟UDP和TCP编程,并通过Wireshark抓包工具,对所发送的报文进行捕获分析。 文章目录 一、RIP协议的模拟与编程二、OSPF协议的模拟与编程三、UDP编程四、TCP套接字编程五、Wireshark 数据分析六、总结一、RIP协议的模拟与编程 1.1 题目 …

虚拟机 NAT模式与桥接模式的区别

同个人网站 https://www.serendipper-x.cn/&#xff0c;欢迎访问 &#xff01; NAT模式&#xff1a;相当于宿主机再构建一个局域网&#xff0c;虚拟机无法和本局域网中的其他真实主机进行通讯。只需要宿主机器能访问互联网&#xff0c;那么虚拟机就能上网&#xff0c;不需要再…

基础研究和前沿技术领域校企融合协同创新的国际经验及启示

来源&#xff1a;中国科学技术发展战略研究院作者&#xff1a;薛姝、何光喜、张文霞原载于《全球科技经济瞭望》2021年5月第5期摘要&#xff1a;促进大学与企业的合作是各个国家科技创新政策和创新体系建设的重点任务&#xff0c;近年来也出现了加强在基础研究和前沿技术领域加…

理解云计算三种服务模式——IaaS、PaaS和SaaS

云计算的服务模式仍在不断进化&#xff0c;但业界普遍接受将云计算按照服务的提供方式划分为三个大类&#xff1a;SaaS&#xff08;Software as a Service–软件即服务&#xff09; PaaS&#xff08;Platform as a Service–平台即服务&#xff09; IaaS&#xff08;Infrastruc…

术,路,心:陈天桥的大脑行旅

来源&#xff1a; 脑极体在互联网、云计算与电动汽车之后&#xff0c;连同资本、产业、学术界在内的社会各界&#xff0c;纷纷开始将目光投向更远的地方。下一个超级机会藏在何处&#xff1f;下一个改变人类文明的技术机遇何时触发&#xff1f;随着各国开始在国家战略层面布局下…

8万行的insert数据,Ctrl+c、Ctrl+v后心态崩了(如何在Linux下对MySQL数据库执行sql文件)...

从最下面可以看到&#xff0c;差不多有86389行&#xff0c;Ctrlc、Ctrlv后 PHPstorm一直没有反应。。。。 肿么办&#xff1f;&#xff1f;复制粘贴不行的话&#xff0c;可以用什么方法把数据插入到数据库中&#xff0c;数据库用的是MySQL。 皇天不负有心人&#xff0c;卧薪尝胆…

链路状态路由协议与OSPF

链路状态路由算法&#xff08;LS算法&#xff09; 工作原理 每个路由器将自己的链路状态信息洪泛到网络上的所有路由器。tips:&#xff08;每个路由器都洪泛会给网络带来负担&#xff09;每个路由器最终会知道整个网络的拓扑结构&#xff08;LSDB&#xff09;。每个路由器使用…

感知算法、规划地图……波士顿动力揭秘Atlas机器人跑酷背后的技术

来源&#xff1a;机器之心&#xff0c;编辑&#xff1a;nhyilin仅用于学术分享&#xff0c;版权属于原作者几天前&#xff0c;波士顿动力公司放出了双足人形机器人 Atlas 的最新酷炫视频。这次&#xff0c;Atlas 展示了它的最新技能「跑酷」。在一系列倾斜胶合板还有木箱垒成的…

BGP协议

概述 BGP是目前“唯一”的EGP协议&#xff0c;用于AS之间传递路由信息&#xff0c;目前版本为4 为什么需要BGP&#xff1f; 不同AS自治系统的管理部门不同&#xff0c;路由策略不同AS之间的路由不强调最优路径&#xff0c;更强调路由控制和路由策略 IGP与BGP对比 IGP关注如…

Science Robotics:新型多足机器人可自行组装,零件损坏时也能继续运动

来源&#xff1a;DeepTech深科技在自然环境中&#xff0c;群体昆虫&#xff08;如蜜蜂、蚂蚁、白蚁等&#xff09;、鱼类和鸟类等动物可以通过合作来完成生物个体难以或不可能完成的任务。受到这些集群行为的启发&#xff0c;许多研究人员研究了自组装或可重构的模块化群机器人…

NAT与DHCP协议

DHCP概述 DHCP产生的原因 大型网络中静态配置IP地址容易出现地址冲突 定义 DHCP&#xff1a;动态主机配置协议&#xff0c;用于主机自动获得IP地址、子网掩码、网关地址、DNS服务器地址&#xff0c;租用期等相关信息。采用C/S模式。DHCP给运行服务器软件、且位置固定的计算机…

OpenGL基础入门及准备

一、计算机图像学相关概念 1.1 计算机图形学&#xff0c;是一种使用数学算法将二维或三维图形转化为计算机显示器所能显示的二维栅格形式的科学。 1.2 屏幕像素组成的网格即称为栅格。 1.3 计算机图形学研究 Modeling&#xff1a;构造场景的三维模型&#xff0c;建模&#…

哈佛商业评论:什么是颠覆性创新?

来源&#xff1a;点滴科技资讯什么是颠覆性创新&#xff1f;在引入该理论 20 年后&#xff0c;我们重新审视了它所解释的和未解释的。本文发表于哈佛商业评论&#xff08;2015 年 12 月&#xff09; 作者&#xff1a;克莱顿 M.克里斯滕森&#xff0c; 迈克尔E雷诺&#xff0c;和…

定长掩码地址划分与VLSM子网划分

定长掩码地址划分 案例 若某个公司得到一个C类网络地址210.33.15.0&#xff0c;假如所有子网的掩码都一样&#xff0c;该如何划分子网&#xff1f; 步骤一&#xff1a;确定子网个数 7个子网&#xff0c;其中4个局域网&#xff0c;3个广域网 步骤2&#xff1a;确定每个子网所需…

OpenGL之几何、投影、裁剪、视口变换以及全局变换与局部变换

一、变换的概念 1.1 图形流水线 1.2 变换&#xff08;Transformation&#xff09; 变换主要分为四个步骤&#xff0c;主要就是在Vertex operations阶段操作顶点信息&#xff0c;会在流水线中依次进行。 几何变换投影变换裁剪视口变换 三维模型到二维图形的主要变换过程&am…

WinForm中DataGridView的TextBoxColumm换行

一、内容超过显示宽度自动换行&#xff1a; 在需要自动换行的列中设置 二、换行符换行&#xff1a; 一开始在需要换行的文本添加"\r\n"并不能直接换行&#xff0c;DGV直接把\r\n显示出来了&#xff0c;后换成 System.Environment.NewLine 解决问题转载于:https://www…

刷脸背后,卷积神经网络的数学原理原来是这样的

来源&#xff1a;深度学习这件小事计算机视觉技术在日常生活中有着非常普遍的应用&#xff1a;发朋友圈之前自动修图、网上购物时刷脸支付……在这一系列成功的应用背后&#xff0c;卷积神经网络功不可没。本文将介绍卷积神经网络背后的数学原理。在自动驾驶、医疗以及零售这些…

OpenGL之坐标系以及单位

1.1 OpenGL中默认的坐标系为右手坐标系&#xff0c;默认视点位置为原点&#xff0c;原点正好投影在投影窗口的中心&#xff0c;也正好投影在视口的中心。 1.2 在OpenGL中无绝对单位&#xff0c;只有相对的大小&#xff0c;相对于视锥体的大小来设定物体的大小。 1.3 通过估算…