java使用socket模拟咖啡馆场景,客户与服务器多线程交互场景

java使用socket模拟咖啡馆场景,客户与服务器多线程交互场景

任务的目标是使用客户机 - 服务器架构构建一个“虚拟咖啡馆”系统每个客户端应用程序将扮演 Customer 谁想点茶或咖啡。服务器应用程序将扮演咖啡馆虚拟的角色 Barista 负责处理订单,准备茶和啡,并将订单交还给客户

  • 启动Socket服务
public class Customer {private static Socket socketClient;private static boolean connectionState = false;private static ObjectOutputStream oos;private static ObjectInputStream ois;public static void main(String[] args) {//Create a client objecttry {Socket s = new Socket("127.0.0.1", 8888);ClientSend sendclient = new ClientSend(s);sendclient.start();// 创建读取字符流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));while(true){String serverimg = br.readLine();System.out.println(serverimg);}} catch (IOException e) {System.out.println("The server is offline.");}}}
  • 发送客户端
public class ClientSend extends Thread {Socket ss;PrintWriter pw;Scanner sc = new Scanner(System.in);public ClientSend(Socket s) {this.ss = s;try {this.pw = new PrintWriter(s.getOutputStream());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {try {System.out.println("Please enter your name :");String name = sc.nextLine();pw.println("name  " + name);pw.flush();while (true){System.out.println("Please enter the command :");String input = sc.nextLine();pw.println(input);pw.flush();if ("exit".equals(input)) {System.out.println("thank you");ss.close();}System.out.println("Please enter the command :");String inpu1 = sc.nextLine();pw.println(inpu1);pw.flush();if ("exit".equals(inpu1)) {System.out.println("thank you");ss.close();}System.out.println("Please enter the command :");String inpu2 = sc.nextLine();pw.println(inpu2);pw.flush();if ("exit".equals(inpu2)) {System.out.println("thank you");ss.close();}System.out.println("Please enter the command :");String inpu3 = sc.nextLine();pw.println(inpu3);pw.flush();if ("exit".equals(inpu3)) {System.out.println("thank you");ss.close();}}} catch (Exception e) {System.out.println("The server is offline.");} finally {if (pw != null) {pw.close();}if (ss != null) {try {ss.close();} catch (IOException e) {System.out.println("");}}}}
}
  • 咖啡制造区
public class MakeCoffeeArea extends Thread {/*** 制作coffee** @param*/@Overridepublic void run() {while (true){//获取未制作的制作coffee开始制作List<Coffee> coffeeList = WaitingArea.getCoffeeList();if (!OrderTool.isEmpty(coffeeList)) {if (coffeeList.size() == 1) {//制作前更新咖啡的状态和订单状态for (int i = 0; i < 1; i++) {Coffee coffee = coffeeList.get(i);coffee.setState(1);Order order = OrderTool.getOrderTool().getOneOrder(coffee.getOrderId());order.setState("1");OrderTool.getOrderTool().updateCoffeeState(order, coffee);}System.out.println("开始制作coffee"+OrderTool.getOrderTool().toOrderList());OrderTool.writeJson("开始制作coffee"+OrderTool.getOrderTool().toOrderList());try {Thread.sleep(45000);} catch (InterruptedException e) {System.out.println(e);}for (int i = 0; i < 1; i++) {Coffee coffee = coffeeList.get(i);coffee.setState(2);Order order = OrderTool.getOrderTool().getOneOrder(coffee.getOrderId());OrderTool.getOrderTool().updateCoffeeState(order, coffee);}} else {for (int i = 0; i < 2; i++) {Coffee coffee = coffeeList.get(i);coffee.setState(1);Order order = OrderTool.getOrderTool().getOneOrder(coffee.getOrderId());order.setState("1");OrderTool.getOrderTool().updateCoffeeState(order, coffee);}System.out.println("开始制作coffee"+OrderTool.getOrderTool().toOrderList());OrderTool.writeJson("开始制作coffee"+OrderTool.getOrderTool().toOrderList());try {Thread.sleep(45000);} catch (InterruptedException e) {e.printStackTrace();}for (int i = 0; i < 2; i++) {Coffee coffee = coffeeList.get(i);coffee.setState(2);Order order = OrderTool.getOrderTool().getOneOrder(coffee.getOrderId());OrderTool.getOrderTool().updateCoffeeState(order, coffee);}}}else {try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}}OrderTool.writeJson("制作列表coffee"+OrderTool.getOrderTool().toOrderList());System.out.println("制作列表coffee"+OrderTool.getOrderTool().toOrderList());}}
}
  • 茶制作区
public class MakeTeaArea extends Thread {@Overridepublic void run() {while (true){//获取未制作的茶开始制作List<Tea> teaList =  WaitingArea.getTeasList();if (!OrderTool.isEmpty(teaList)){if (teaList.size()==1){for (int i=0;i<1;i++){Tea tea =  teaList.get(i);tea.setState(1);Order order = OrderTool.getOrderTool().getOneOrder(tea.getOrderId());order.setState("1");OrderTool.getOrderTool().updateTeaState(order,tea);}System.out.println("开始制作茶"+OrderTool.getOrderTool().toOrderList());try {Thread.sleep(30000);} catch (InterruptedException e) {e.printStackTrace();}for (int i=0;i<1;i++){Tea tea =  teaList.get(i);tea.setState(2);Order order = OrderTool.getOrderTool().getOneOrder(tea.getOrderId());OrderTool.getOrderTool().updateTeaState(order,tea);}}else {for (int i=0;i<2;i++){Tea tea =  teaList.get(i);tea.setState(1);Order order = OrderTool.getOrderTool().getOneOrder(tea.getOrderId());OrderTool.getOrderTool().updateTeaState(order,tea);}System.out.println("开始制作茶"+OrderTool.getOrderTool().toOrderList());try {Thread.sleep(30000);} catch (InterruptedException e) {e.printStackTrace();}for (int i=0;i<2;i++){Tea tea =  teaList.get(i);tea.setState(2);Order order = OrderTool.getOrderTool().getOneOrder(tea.getOrderId());order.setState("1");OrderTool.getOrderTool().updateTeaState(order,tea);}}}else {try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("制作茶列表"+OrderTool.getOrderTool().toOrderList());}}}
  • 托盘区
public class TrayArea extends Thread{@Overridepublic void run() {while (true){try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}List<Order>   orders  = OrderTool.getOrderTool().getByStateOrderList("1");System.out.println("订单状态为制作中"+OrderTool.toJson(orders));//OrderTool.writeJson("订单状态为制作中"+OrderTool.toJson(orders));if (!OrderTool.isEmpty(orders)){orders.forEach(order -> {if (!OrderTool.isEmpty(order.getTeas())&&OrderTool.isEmpty(order.getCoffees())){boolean   teaOk=    order.getTeas().stream().allMatch(tea -> "2".equals(String.valueOf(tea.getState())));if (teaOk){order.setState("2");}}if (!OrderTool.isEmpty(order.getCoffees())&&OrderTool.isEmpty(order.getTeas())){boolean   coffeeOk=    order.getCoffees().stream().allMatch(coffee -> "2".equals(String.valueOf(coffee.getState())));if (coffeeOk){order.setState("2");}}if (!OrderTool.isEmpty(order.getCoffees())&&!OrderTool.isEmpty(order.getTeas())){boolean   coffeeOk=    order.getCoffees().stream().allMatch(coffee -> "2".equals(String.valueOf(coffee.getState())));boolean   teaOk=    order.getTeas().stream().allMatch(tea -> "2".equals(String.valueOf(tea.getState())));if (coffeeOk&&teaOk){order.setState("2");}}});List<Order>   orderList  =OrderTool.getOrderTool().getByStateOrderList("2");orderList.stream().forEach(order -> {if (!OrderTool.isEmpty(order.getTeas())&&OrderTool.isEmpty(order.getCoffees())){ThreadQueue.getThreadQueue().sendAll("order delivered to "+order.getName()+"  ("+order.getTeas().size()+" teas)");}if (!OrderTool.isEmpty(order.getCoffees())&&OrderTool.isEmpty(order.getTeas())){ThreadQueue.getThreadQueue().sendAll("order delivered to "+order.getName()+"  ("+order.getCoffees().size()+" coffee)");}if (!OrderTool.isEmpty(order.getCoffees())&&!OrderTool.isEmpty(order.getTeas())){ThreadQueue.getThreadQueue().sendAll("order delivered to "+order.getName()+"  ("+order.getTeas().size()+" teas and "+order.getCoffees().size()+" coffee)");}try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}OrderTool.getOrderTool().getOrderList().remove(order);});}else {try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}}}}}
  • 等候区
public class WaitingArea  {/*** 获取需要制作咖啡* @return*/public static  List<Coffee> getCoffeeList(){List<Coffee>  coffeeList = new ArrayList<>();List<Order>   orders =  OrderTool.getOrderTool().getOrderList();if (!OrderTool.isEmpty(orders)){orders.stream().forEach(order -> {order.setState("1");if (!OrderTool.isEmpty(order.getCoffees())){order.getCoffees().stream().forEach(coffee -> {//未制作if (coffee.getState()==0){coffeeList.add(coffee);}});}});}return coffeeList;}/*** 获取需要制作茶* @return*/public static List<Tea> getTeasList(){List<Tea> teaList = new ArrayList<>();List<Order>   orders =  OrderTool.getOrderTool().getOrderList();if (!OrderTool.isEmpty(orders)){orders.stream().forEach(order -> {order.setState("1");if (!OrderTool.isEmpty(order.getTeas())){order.getTeas().stream().forEach(tea -> {//未制作if (tea.getState()==0){teaList.add(tea);}});}});}return teaList;}
}
  • 线程队列
public class ThreadQueue {//创建单例模型private ThreadQueue() {}private static final ThreadQueue si = new ThreadQueue();public static ThreadQueue getThreadQueue() {return si;}//创建一个存储 线程 和端口  的Hashtable集合Hashtable<SocketListeningAndSend, Socket> ht = new Hashtable<SocketListeningAndSend, Socket>();public void add(SocketListeningAndSend ri, Socket nowsocket) {//将每一个线程 和 对应的socket 加入集合中ht.put(ri, nowsocket);}//线程清除public void remove(SocketListeningAndSend ri, Socket nowsocket) {ht.remove(ri, nowsocket);}//表示当前的线程给集合中的 非自己 的线程发送的信息public void sendAll( String img) {//遍历集合for (Map.Entry<SocketListeningAndSend, Socket> entry : ht.entrySet()) {SocketListeningAndSend nowRi = entry.getKey();//传递 不一致客户端线程,并且发送当前 线程的socket信息nowRi.firstSend(img, ht.get(nowRi));}}
}
public class SocketListeningAndSend extends Thread {Socket socket;String port;public SocketListeningAndSend(Socket s, String port) {this.socket = s;this.port = port;}public void firstSend(String str, Socket nowsocket) {try {socket.getOutputStream().write((str + "\r\n").getBytes());} catch (IOException e) {OrderTool.writeJson("The client is disconnected. Procedure");//需要写一个清除当前该客户端的方法ThreadQueue.getThreadQueue().remove(this, socket);OrderTool.writeJson(socket.getPort() + "The client is disconnected. Procedure");Order order = OrderTool.getOrderTool().getOneOrder(String.valueOf(socket.getPort()));OrderTool.getOrderTool().getOrderList().remove(order);}}@Overridepublic void run() {OrderTool orderTool = OrderTool.getOrderTool();try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;//接收客户端的数据while ((line = br.readLine()) != null) {String[] s = line.split(" ");for (int i = 0; i < s.length; i++) {System.out.println(s[i] + "--" + i);}System.out.println(OrderTool.toJson(s));switch (s[0]) {case "name":if (!isBlank(s[2])) {int id = socket.getPort();orderTool.createOrder(String.valueOf(id), s[2], 0, 0);} else {firstSend("You typed the name in the wrong format", socket);}break;case "order":int id = socket.getPort();if (s.length == 3) {if ("tea".equals(s[2])) {orderTool.createOrder(String.valueOf(id), null, Integer.valueOf(s[1]), 0);}if ("coffee".equals(s[2])) {orderTool.createOrder(String.valueOf(id), null, 0, Integer.valueOf(s[1]));}if ("status".equals(s[2])) {Order order = orderTool.getOneOrder(String.valueOf(id));int coffeeState0 = orderTool.getByStateCoffeeList(order, "0");int teaState0 = orderTool.getByStateTeaList(order, "0");if (coffeeState0 > 0 && teaState0 > 0) {firstSend(coffeeState0 + " coffee and " + teaState0 + " teas in waiting area", socket);} else if (coffeeState0 > 0) {firstSend(coffeeState0 + " coffee  in waiting area", socket);} else if (teaState0 > 0) {firstSend(teaState0 + " teas  in waiting area", socket);}int coffeeState1 = orderTool.getByStateCoffeeList(order, "1");int teaState1 = orderTool.getByStateTeaList(order, "1");if (coffeeState1 > 0 && teaState1 > 0) {firstSend(coffeeState1 + " coffee and " + teaState1 + " teas currently being prepared", socket);} else if (coffeeState1 > 0) {firstSend(coffeeState1 + " coffee  in currently being prepared", socket);} else if (teaState1 > 0) {firstSend(teaState1 + " teas  in currently being prepared", socket);}int coffeeState2 = orderTool.getByStateCoffeeList(order, "2");int teaState2 = orderTool.getByStateTeaList(order, "2");if (coffeeState2 > 0 && teaState2 > 0) {firstSend(coffeeState2 + " coffee and " + teaState2 + " teas currently in the tra", socket);} else if (coffeeState2 > 0) {firstSend(coffeeState2 + " coffee  in currently in the tra", socket);} else if (teaState2 > 0) {firstSend(teaState2 + " teas  in currently in the tra", socket);}if (coffeeState0 == 0 && teaState0 == 0 && coffeeState1 == 0 && teaState1 == 0 && coffeeState2 == 0 && teaState2 == 0) {firstSend("No order was found for " + order.getName(), socket);}}} else if (s.length == 6) {if (("tea".equals(s[2]) || "teas".equals(s[2])) && ("coffee".equals(s[5]) || "coffees".equals(s[5]))) {orderTool.createOrder(String.valueOf(id), null, Integer.valueOf(s[1]), Integer.valueOf(s[4]));}if (("coffee".equals(s[2]) || "coffees".equals(s[2])) && ("tea".equals(s[5]) || "teas".equals(s[5]))) {orderTool.createOrder(String.valueOf(id), null, Integer.valueOf(s[4]), Integer.valueOf(s[1]));}} else {firstSend("Please enter the correct command", socket);return;}if (!"status".equals(s[2])) {Order order = orderTool.createOrder(String.valueOf(id), null, 0, 0);String str = "order received for ";if (!isBlank(order.getName())) {str += order.getName();}if (!OrderTool.isEmpty(order.getTeas()) && OrderTool.isEmpty(order.getCoffees())) {str += "(" + order.getTeas().size() + " teas}";}if (!OrderTool.isEmpty(order.getCoffees()) && OrderTool.isEmpty(order.getTeas())) {str += "(" + order.getCoffees().size() + " coffees}";}if (!OrderTool.isEmpty(order.getCoffees()) && !OrderTool.isEmpty(order.getTeas())) {str += "(" + order.getTeas().size() + " teas and  " + order.getCoffees().size() + " coffees}";}firstSend(str, socket);}break;default:firstSend("Error of instruction", socket);break;}}} catch (IOException e) {System.out.println(socket.getPort() + "The client is disconnected. Procedure");OrderTool.writeJson(socket.getPort() + "The client is disconnected. Procedure");}}public static boolean isBlank(final CharSequence cs) {int strLen;if (cs == null || (strLen = cs.length()) == 0) {return true;}for (int i = 0; i < strLen; i++) {if (Character.isWhitespace(cs.charAt(i)) == false) {return false;}}return true;}
}
public class ServerAccept extends Thread{@Overridepublic void run() {try {System.out.println("Wait for the client to connect");ServerSocket ss = new ServerSocket(8888);//由于可能当有多个客户端连接时,accept方法就会产生多个Socket对象,需加一个while循环监听来自客户端的连接while(true){//侦听套接字的连接,accept是一个阻塞的方法,会阻塞当前的线程Socket s = ss.accept();//建立连接,表示serverSocket在监听,如果监听到有客户端连接则会调用accept方法,然后返回一个Socket,最后建立连接SocketListeningAndSend rs = new SocketListeningAndSend(s,String.valueOf(s.getPort()));//会产生多条线程rs.start();ThreadQueue.getThreadQueue().add(rs,s);//只有一个实例MakeTeaArea makeTeaArea = new MakeTeaArea();makeTeaArea.start();MakeCoffeeArea makeCoffeeArea =new MakeCoffeeArea();makeCoffeeArea.start();TrayArea trayArea = new TrayArea();trayArea.start();}} catch (IOException e ) {System.out.println(e);}}
}
public class OrderTool {private static final OrderTool ORDER_TOOL = new OrderTool();/*** 获取所有订单*/private List<Order> orderList;private OrderTool(){}static {ORDER_TOOL.orderList=new ArrayList<>();}public   List<Order> getOrderList(){return  this.orderList;}/*** 获取不同* @param state   0 等待区  1 制作区  2 等候  3完成* @return*/public List<Order> getByStateOrderList(String state){List<Order>   orders=  ORDER_TOOL.getOrderList();List<Order>   stateOrderList =new ArrayList<>();for (int i =0;i<orders.size();i++){Order  order1 = orderList.get(i);if (state.equals(order1.getState())){stateOrderList.add(order1);}}return  stateOrderList;}/*** 获取不同状态 Coffee 数量* @param order* @param state* @return*/public  int  getByStateCoffeeList(Order order,String state){List<Coffee> coffees =new ArrayList<>();if (!isEmpty(order.getCoffees())){order.getCoffees().forEach(coffee -> {if (String.valueOf(coffee.getState()).equals(state)){coffees.add(coffee);}});}return  coffees.size();}/*** 获取不同状态 Tea 数量* @param order* @param state* @return*/public int  getByStateTeaList(Order order,String state){List<Tea> teas =new ArrayList<>();if (!isEmpty(order.getTeas())){order.getTeas().forEach(tea -> {if (String.valueOf(tea.getState()).equals(state)){teas.add(tea);}});}return  teas.size();}/*** 根据订单id 获取订单详情* @param orderId* @return*/public Order getOneOrder(String orderId){List<Order>   orders=  ORDER_TOOL.getOrderList();Order order=null;for (int i =0;i<orders.size();i++){Order  order1 = orderList.get(i);if (orderId.equals(order1.getId())){order=order1;}}return  order;}public Order updateTeaState(Order order, Tea tea){if (isEmpty(order.getTeas())){order.getTeas().stream().forEach(tea1 -> {if (tea1.getId().equals(tea.getId())){tea1.setState(tea.getState());}});}return  order;}public Order updateCoffeeState(Order order,Coffee coffee){if (isEmpty(order.getCoffees())){order.getCoffees().stream().forEach(coffee1 -> {if (coffee1.getId().equals(coffee.getId())){coffee1.setState(coffee.getState());}});}return  order;}public static OrderTool getOrderTool(){return ORDER_TOOL;}public   Order createOrder(String  id, String name, int teaNum, int coffeeNum){Order order=null;List<Order> orderList = ORDER_TOOL.getOrderList();//查询订单是否存在,存在获取现有订单for (int i =0;i<orderList.size();i++){Order  order1 = orderList.get(i);if (id.equals(order1.getId())){order=order1;orderList.remove(order1);}}if (order==null){order=new Order();order.setId(id);}if (isBlank(order.getName())&&name!=null){order.setName(name);}List<Tea> teas =null;List<Coffee> coffees = null;if (isEmpty(order.getTeas())){teas= new ArrayList<>() ;}else {teas=order.getTeas();}if (isEmpty(order.getCoffees())){coffees= new ArrayList<>() ;}else {coffees=order.getCoffees();}//创建tea订单for (int i =0;i<teaNum;i++){Tea tea = new Tea();int num = (int)(Math.random()*10000);tea.setId(String.valueOf(num));tea.setOrderId(id);tea.setState(0);teas.add(tea);}//创建咖啡订单for (int i =0;i<coffeeNum;i++){Coffee coffee = new Coffee();int num = (int)(Math.random()*10000);coffee.setId(String.valueOf(num));coffee.setOrderId(id);coffee.setState(0);coffees.add(coffee);}if (!isEmpty(teas)){order.setTeas(teas);}if (!isEmpty(coffees)){order.setCoffees(coffees);}ORDER_TOOL.getOrderList().add(order);return  order;}public String  toOrderList(){return   "list--"+toJson( ORDER_TOOL.getOrderList())+"size--"+ ORDER_TOOL.getOrderList().size();}public static boolean isBlank(final CharSequence cs) {int strLen;if (cs == null || (strLen = cs.length()) == 0) {return true;}for (int i = 0; i < strLen; i++) {if (Character.isWhitespace(cs.charAt(i)) == false) {return false;}}return true;}public static boolean isEmpty(Collection coll) {return (coll == null || coll.isEmpty());}public static String toJson(Object obj) {Gson gson = new Gson();return gson.toJson(obj);}public static void writeJson(String str){BufferedWriter writer = null;File file =new File("C:\\virtualCoffeeShop\\login.txt");if (!file.exists()){try {file.createNewFile();}catch (IOException e){System.out.println(e);}}try {writer = new BufferedWriter(new FileWriter(file));writer.write(str);}catch (IOException e){System.out.println(e);}finally {if (writer!=null){try {writer.close();}catch (Exception e){System.out.println(e);}}}}}

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

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

相关文章

OpenCV-风格迁移

文章目录 一、原理二、关键步骤三、实现方法四、可选参数五、示例代码六、总结 OpenCV中的风格迁移是一种计算机视觉技术&#xff0c;它允许用户将一种图像的风格转移到另一幅图像上&#xff0c;从而创造出具有独特美学效果的新图像。这种技术在艺术、设计和娱乐等领域有着广泛…

elementui中table标题和内容插槽

代码 <template> <el-table :data"tableData"> <el-table-column> <template slot"header" slot-scope"scope"> <el-tooltip content"这是列的提示信息" placement"top"> <span>…

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…

【LeetCode】动态规划—95. 不同的二叉搜索树 II(附完整Python/C++代码)

动态规划—95. 不同的二叉搜索树 II 题目描述前言基本思路1. 问题定义二叉搜索树的性质&#xff1a; 2. 理解问题和递推关系递归构造思想&#xff1a;状态定义&#xff1a;递推公式&#xff1a;终止条件&#xff1a; 3. 解决方法递归 动态规划方法&#xff1a;伪代码&#xff…

sentinel dashboard改造落地设计实现解释(一)-分布式fetcher和metrics存储/搜索

背景 微服务是目前java主流架构,微服务架构技术栈有,服务注册中心,网关,熔断限流,服务同学,配置中心等组件,其中,熔断限流主要3个功能特性,限流,熔断,快速失败。Sentinel是阿里开源的熔断限流组件,sentinel dashboard是演示级别,表现在metrics采集是单机版,metri…

Linux内核 -- 文件系统之超级块 super_operations 字段作用与用法

struct super_operations 字段的作用与用法 super_operations 是 Linux 内核中定义的一个结构体&#xff0c;用于描述与文件系统超级块 (super_block) 相关的操作。这些操作涵盖了文件系统的创建、删除、挂载、卸载等。 结构体定义 struct super_operations {struct inode *…

如何使用vscode的launch.json来debug调试

1、创建一个launch.json文件 选择Python Debugger&#xff0c;再选择Python文件&#xff0c;创建处理如下 默认有下面五个参数 "name": "Python Debugger: Current File","type": "debugpy","request": "launch"…

C++ struct 和 class 的区别、C++结构体和C结构体的区别等基础知识。

特性C structC classC struct默认访问控制符publicprivate全部公开支持成员函数是是否继承支持是是否模板支持是是否运算符重载是是否 在C中&#xff0c;struct 和 class 是两种非常相似的用户定义类型&#xff0c;二者有一些关键区别。C的 struct 与 C 语言中的 struct 也存在…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…

【LeetCode】动态规划—123. 买卖股票的最佳时机 III(附完整Python/C++代码)

动态规划—123. 买卖股票的最佳时机 III 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义&#xff1a;状态转移公式&#xff1a;初始条件&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Python代码解释 C代码C代码解…

07_23 种设计模式之《桥接模式》

文章目录 一、桥接模式基础知识二、桥接模式实战应用 一、桥接模式基础知识 桥接模式定义&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以 独立地变化。桥接模式的结构图如下&#xff1a; Abstraction&#xff1a;抽象部分的接口。 RefinedAbstraction&…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

List子接口

1.特点&#xff1a;有序&#xff0c;有下标&#xff0c;元素可以重复 2.方法&#xff1a;包含Collection中的所有方法&#xff0c;还包括自己的独有的方法&#xff08;API中查找&#xff09; 还有ListIterator&#xff08;迭代器&#xff09;&#xff0c;功能更强大。 包含更多…

llava1.5论文阅读

Improved Baselines with Visual Instruction Tuning 通过视觉指令微调增强的基线方法 论文摘要&#xff1a; 我们发现&#xff0c;LLaVA中的全连接视觉语言连接器非常强大且数据效率高。 3.3 数据和模型的scaling 受到将线性投影转变为多层感知机&#xff08;MLP&#xff0…

支付宝支付Java+uniapp支付宝小程序

JS&#xff1a; request.post(/vip/pay, {//这是自己写的java支付接口id: this.vipInfo.id,payWay: alipay-mini}).then((res) > {let success (res2) > {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() > {this.doGetVipI…

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

时间序列在回归预测的领域的重要性&#xff0c;不言而喻&#xff0c;在数学建模中使用及其频繁&#xff0c;但是你真的了解ARIMA、AR、MA么&#xff1f;ACF图你会看么&#xff1f;&#xff1f; 时间序列数据如何构造&#xff1f;&#xff1f;&#xff1f;&#xff0c;我打过不少…

读书笔记 - 虚拟化技术 - 0 QEMU/KVM概述与历史

《QEMU/KVM源码解析与应用》 - 王强 概述 虚拟化简介 虚拟化思想 David Wheeler&#xff1a;计算机科学中任何问题都可以通过增加一个中间层来解决。 虚拟化思想存在与计算机科学的各个领域。 主要思想&#xff1a;通过分层将底层的复杂&#xff0c;难用的资源虚拟抽象为简…

32单片机 低功耗模式

以下是一个基于STM32的低功耗模式示例代码&#xff0c;展示如何将STM32微控制器置于低功耗模式&#xff0c;并在特定条件下唤醒它。这个示例使用的是STM32 HAL库。 ### 示例代码&#xff1a;进入睡眠模式并使用外部中断唤醒 c #include "stm32f4xx_hal.h" // 函数声明…

笔记本电脑按住电源键强行关机,对电脑有伤害吗?

电脑卡住了&#xff0c;我们习惯性地按住电源键或者直接拔掉电源强制关机&#xff0c;但这种做法真的安全吗&#xff1f;会不会对电脑造成伤害呢&#xff1f; 其实&#xff0c;按住电源键关机和直接拔掉电源关机是不一样的。它们在硬件层面有着本质区别。 按住电源键关机 当…

网络常用配置和运维命令以及使用方法

一、网络运维常见配置及命令 以下是一些整理简单网络常用配置和运维命令 1、ifconfig/ipconfig&#xff1a;查看和配置网络接口配置。 用法&#xff1a;ifconfig 或 ipconfig2、route/netstat -r&#xff1a;查看路由表。 用法&#xff1a;route -n 或 netstat -r3、netsta…