网络编程_TCP通信综合练习:

1

image.png

//client::
public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket s=new Socket("127.0.0.1",10000);//获取输出流OutputStream op = s.getOutputStream();//因为要不断发送数据,所以可以使用Sacnner录入数据,结合循环将数据发出去Scanner sc=new Scanner(System.in);while (true) {//键盘录入System.out.println("请输入一个数据");String str = sc.next();//如果输入886就退出发送if ("886".equals(str)){break;}op.write(str.getBytes());}//关流s.close();}
}
//Server:
public class Server {public static void main(String[] args) throws IOException {//不断接收//创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);//等待客户端来连接Socket socket = ss.accept();//创建一个输入流对象InputStream is = socket.getInputStream();//转换流:字节转字符InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1) {System.out.print((char) b);}//关流socket.close();//关闭通道ss.close();//关闭服务器}
}

先启动服务器,再启动客户端
控制台:
image.pngimage.png

2

image.png

//client
public class Client {public static void main(String[] args) throws IOException {//客户端:发送一条数据,接收服务端反馈的消息并打印//服务器:接收数据并打印,再给客户端反馈消息//1.创建Socket对象并连接服务端Socket socket = new Socket("127.0.0.1",10000);//2.写出数据String str = "见到你很高兴!";OutputStream os = socket.getOutputStream();os.write(str.getBytes());//写出一个结束标记,(结束输出流)socket.shutdownOutput();//3.接收服务端回写的数据InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1){System.out.print((char)b);}//释放资源socket.close();}
}//Server
public class Server {public static void main(String[] args) throws IOException {//客户端:发送一条数据,接收服务端反馈的消息并打印//服务器:接收数据并打印,再给客户端反馈消息//1.创建对象并绑定10000端口ServerSocket ss = new ServerSocket(10000);//2.等待客户端连接Socket socket = ss.accept();//3.socket中获取输入流读取数据InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;//细节://read方法会从连接通道中读取数据//但是,需要有一个结束标记,此处的循环才会停止//否则,程序就会一直停在read方法这里,等待读取下面的数据while ((b = isr.read()) != -1){System.out.println((char)b);}//4.回写数据String str = "到底有多开心?";OutputStream os = socket.getOutputStream();os.write(str.getBytes());//释放资源socket.close();ss.close();}
}

image.pngimage.png

3

image.png
下面的例子是传输图片,所以使用字节流

//Client
public class Client {public static void main(String[] args) throws IOException {//创建Socket对象连接服务器Socket s = new Socket("127.0.0.1", 10000);//读取图片文件:使用字节流//图片较大:使用缓冲流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..\\netcode\\clientdir\\a.jpg"));//在通道中获取字节流,输入数据到服务端BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());//边读边写byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//结束标识s.shutdownOutput();//接受服务端回馈:字节流-->字符流---->缓冲流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));int b;while((b=br.read())!=-1){System.out.print((char) b);}//关流s.close();}
}//server
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);//等待客户端连接Socket socket = ss.accept();//获取通道中传来的数据//字节流读取字节//缓冲流提升效率BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//输出到本地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\netcode\\serverdir\\a.jpg"));byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//返回信息:字节流-->字符流---->缓冲流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();//关流socket.close();ss.close();}}

image.pngimage.png

4.

image.png

//client
public class Client {public static void main(String[] args) throws IOException {//创建Socket对象连接服务器Socket s = new Socket("127.0.0.1", 10000);//读取图片文件:使用字节流//图片较大:使用缓冲流BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..\\netcode\\clientdir\\a.jpg"));//在通道中获取字节流,输入数据到服务端BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());//边读边写byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//结束标识s.shutdownOutput();//接受服务端回馈:字节流-->字符流---->缓冲流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));int b;while((b=br.read())!=-1){System.out.print((char) b);}//关流s.close();}
}//Server
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);//等待客户端连接Socket socket = ss.accept();//获取通道中传来的数据//字节流读取字节//缓冲流提升效率BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//随机uuid、String str = UUID.randomUUID().toString().replace("-", "");//输出到本地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\netcode\\serverdir\\" + str + ".jpg"));byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//返回信息:字节流-->字符流---->缓冲流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();//关流socket.close();ss.close();}}

image.png

5.

image.png
服务端不停止,用户端一直传
思路:可以在服务端使用循环嵌套:
如下:

public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);while (true) {//等待客户端连接Socket socket = ss.accept();//获取通道中传来的数据//字节流读取字节//缓冲流提升效率BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//随机uuid、String str = UUID.randomUUID().toString().replace("-", "");//输出到本地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\netcode\\serverdir\\" + str + ".jpg"));byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);//当第一个用户还在传输时,服务端代码还会在这不断循环}bos.flush();//返回信息:字节流-->字符流---->缓冲流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();//关流socket.close();//断开当前通道//ss.close();//关闭服务器    ----这里不可以让服务器关闭}}
}

但是循环有弊端,它是一种单线程,如果说此时要传输的文件很大,当第一个用户还在传输时,服务端代码还会停止在第25行,此时就无法和第二个用户产生连接(只有完成一次循环后,才能和下一个用户进行数据连接),所以我们可以用多线程来改进。使多个用户可以同时传输数据,服务端也可以同时读取多个用户的数据

//多线程
public class MyThread  extends Thread{Socket socket;public MyThread (Socket socket){this.socket=socket;}@Overridepublic void run() {//获取通道中传来的数据//字节流读取字节//缓冲流提升效率try {BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//随机uuid、String str = UUID.randomUUID().toString().replace("-", "");//输出到本地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\netcode\\serverdir\\" + str + ".jpg"));byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//返回信息:字节流-->字符流---->缓冲流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();} catch (IOException e) {throw new RuntimeException(e);}finally {//5.释放资源if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}//Server
public class Server {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);while (true) {//等待客户端连接Socket socket = ss.accept();new MyThread(socket).start();//ss.close();}}
}//client....

6.

image.png
使用自定义线程池

//Server
public class Server {public static void main(String[] args) throws IOException {//1创建线程池对象ThreadPoolExecutor pool = new ThreadPoolExecutor(3,//核心线程数量16,//线程池总大小60,//空闲时间TimeUnit.SECONDS,//单位new ArrayBlockingQueue<>(2),//队列Executors.defaultThreadFactory(),//线程工厂,让线程池如何创建线程对象new ThreadPoolExecutor.AbortPolicy()//拒绝策略);//2创建ServerSocket对象ServerSocket ss = new ServerSocket(10000);while (true) {//3等待客户端连接Socket socket = ss.accept();//开启一条线程//一个用户就对应服务端的一条线程//调用submit方法传入myRunnable对象pool.submit((new MyRunnable(socket)));//ss.close();}}
}
//MyRunnable
public class MyRunnable implements Runnable {Socket socket;public MyRunnable(Socket socket){this.socket=socket;}@Overridepublic void run() {//获取通道中传来的数据//字节流读取字节//缓冲流提升效率try {BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//随机uuid、String str = UUID.randomUUID().toString().replace("-", "");//输出到本地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\netcode\\serverdir\\" + str + ".jpg"));byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.flush();//返回信息:字节流-->字符流---->缓冲流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();} catch (IOException e) {throw new RuntimeException(e);}finally {//5.释放资源if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
//client.....

7.

image.png

public class Server {public static void main(String[] args) throws IOException {//客户端:多次发送数据//服务器:接收多次接收数据,并打印//1.创建对象绑定10000端口ServerSocket ss = new ServerSocket(10000);//2.等待客户端来连接Socket socket = ss.accept();//3.读取数据InputStreamReader isr = new InputStreamReader(socket.getInputStream());int b;while ((b = isr.read()) != -1){System.out.print((char)b);}//4.释放资源socket.close();ss.close();}
}

首先启动服务端:
再在浏览器输入:
image.png
获得到数据:
image.png

8.

image.png
client

package A;import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Client1 {public static void main(String[] args) throws IOException {/*** 每一个客户端都是一个线程*/while (true) {//1.与服务端建立连接Socket socket = new Socket("127.0.0.1", 10000);System.out.println("服务器已连接");//2生成聊天界面System.out.println("==============欢迎来到黑马聊天室================");System.out.println("1登录");System.out.println("2注册");System.out.println("请输入您的选择:");//3键盘录入Scanner sc = new Scanner(System.in);String choose = sc.nextLine();//判断:switch (choose) {case "1"://登录逻辑login(socket);break;case "2"://注册逻辑break;default:System.out.println("没有该选项");}}}/*** //登录** @param socket* @throws IOException*/private static void login(Socket socket) throws IOException {//1输入账户和密码Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.nextLine();System.out.println("请输入密码");String password = sc.nextLine();//***登录要求使用username=zhangsan&password=123这种格式发给服务端//2拼接StringBuilder sb = new StringBuilder();sb.append("username=").append(username).append("&password=").append(password);//3提交给服务器验证BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//第一次是告诉服务器是此时登陆操作是什么bw.write("login");bw.newLine();//这两个要配套使用bw.flush();//第二次告诉服务器用户端输入的账号密码bw.write(sb.toString());bw.newLine();bw.flush();//接收服务端的回馈消息BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = br.readLine();if ("1".equals(message)) {System.out.println("登陆成功,可以开始聊天");//开一条单独的线程,专门用来接收服务端转发过来的聊天记录new Thread(new ClientMyRunnable(socket)).start();//将要说的话传给服务器,交给服务器转发给其他客户端talk2All(bw);} else if ("2".equals(message)) {System.out.println("密码不正确");} else {System.out.println("用户名不存在,请先注册");}}private static void talk2All(BufferedWriter bw) throws IOException {Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入你要说的话");String message = sc.nextLine();bw.write(message);bw.newLine();bw.flush();}}
}class ClientMyRunnable implements Runnable {Socket socket;//构造public ClientMyRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {//循环包裹,不断读取服务端发过来的信息(接受群发消息)while (true) {try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = br.readLine();System.out.println(message);} catch (IOException e) {throw new RuntimeException(e);}}}
}

server

package A;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
import java.nio.file.attribute.UserPrincipal;
import java.util.ArrayList;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Server {//成员位置方便调用static  ArrayList<Socket>list=new ArrayList<>();public static void main(String[] args) throws IOException {//1创建ServerSocket对象,并连接10000端口ServerSocket ss = new ServerSocket(10000);//2把本地文件中的正确用户名和密码都获取到Properties prop = new Properties();FileInputStream fis = new FileInputStream("..\\Chat\\account.txt");prop.load(fis);fis.close();//只要来了一个客户端,就开一个条线程while (true) {//等待服务端连接Socket socket = ss.accept();System.out.println("有客户端来连接");//开始处理线程任务new Thread(new MyRunnable(socket, prop)).start();}}
}//-----------------------------------------------------------------------
class MyRunnable implements Runnable {Socket socket;Properties prop;//构造public MyRunnable(Socket socket, Properties prop) {this.socket = socket;this.prop = prop;}@Overridepublic void run() {/*** 每一个线程要做的事情*/try {//1读取客户端传来的信息BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//第一次读取的是用户的操作String choose = br.readLine();while (true) {switch (choose) {case "login" -> login(br);case "register" -> register();}}} catch (IOException e) {throw new RuntimeException(e);}}/*** 1.获取用户端输入的帐号、密码* 2.与正确的账号密码比较* 3.写出不同情况的返回信息*/public void login(BufferedReader br) throws IOException {System.out.println("用户执行了登陆操作");//第二次读取的是用户端传递过来的拼接信息:username=zhangsan&password=123String userInfo = br.readLine();//获取真正的账号密码:切割String s1 = userInfo.split("&")[0];String s2 = userInfo.split("&")[1];String usernameInput = s1.split("=")[1];String passwordInput = s2.split("=")[1];System.out.println("账号是:" + usernameInput);System.out.println("密码是:" + passwordInput);//比较if (prop.containsKey(usernameInput)) {//用户名一致,就比较密码//先获取当前正确密码String rellyPassword = (String) prop.get(usernameInput);if (passwordInput.equals(rellyPassword)) {//登陆成功,给用户端返回信息messageToClient("1");//登陆成功,可以开始聊天//登陆成功后需要将当前socket对象存储起来Server.list.add(socket);//接收客户端发送的信息并打印在控制台talk2All(br,usernameInput);} else {//密码不正确,给用户端返回信息messageToClient("2");//密码不正确}} else {//用户名不存在,给用户端返回信息:messageToClient("3");//用户名不存在,请先注册}}private void talk2All(BufferedReader br, String usernameInput) throws IOException {//聊天死循环while(true){//接收客户端发送的信息String message = br.readLine();System.out.println(usernameInput+"发送过来了消息:"+message);//群发for (Socket s : Server.list) {//s以此表示每一个socket对象messageToClient(s,usernameInput+"发送过来了消息:"+message);}}}/***因为三种情况:登陆成功、密码不正确、用户名不存在都要返回信息给客户端,所以干脆抽取成方法* @param message*/public void messageToClient(String message) throws IOException {//获取输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(message);bw.newLine();bw.flush();}/*** 重载的messageToClient* @param socket* @param message*/public void messageToClient(Socket socket,String message) throws IOException {//获取输出流,将数据写给当前的socket通道对象BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(message);bw.newLine();bw.flush();}/*** 注册逻辑*/private static void register() {System.out.println("用户执行了注册操作");}}

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

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

相关文章

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

【Web】CTFSHOW java反序列化刷题记录(部分)

目录 web846 web847 web848 web849 web850 web856 web857 web858 web846 直接拿URLDNS链子打就行 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.lang.reflect.F…

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

用GPT-4开启“人类宝藏”

“GPT-4开启人类宝藏”意味着下面几个层面的含义&#xff1a; 知识与信息的访问&#xff1a;GPT-4作为一款强大的语言模型&#xff0c;通过学习海量的数据和信息资源&#xff0c;可以近乎实时地提供人类历史积累的知识、经验与智慧。用户可以通过询问或交互方式获取这些信息&am…

数据库所在服务器磁盘满了怎么办?

大家好&#xff0c;我是G探险者。 给大家拜个晚年哈&#xff0c;节后上班第一天&#xff0c;打开电脑&#xff0c;发现数据库服务器连不上了。 幸亏&#xff0c;节后第一天上班的人不太多&#xff0c;领导还没来&#xff0c;我一番鼓捣解决了这个问题。 所以做个总结&#xff0…

Linux网络----防火墙

一、安全技术和防火墙 1、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安…

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间&#xff0c;但此时觉得一切都值&#xff0c;又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分&#xff0c;上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…

Cannot resolve symbol ‘IWXAPI‘

问题 Android 集成 微信登录报错 Cannot resolve symbol IWXAPI详细问题 笔者在App的build.gradle中已添加相关依赖&#xff0c;并完成Sync gradle操作。 笔者Project的build.gradle核心代码 buildscript {repositories {jcenter() // 原有 jCenter 引用可继续保留…

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)

1. 目的&#xff1a;简单监控pod 我想使用java监控k8s pod的资源的简单使用情况&#xff0c;但是k8s内部并没有采集资源的实现。 但是k8s提供了一套k8s的对接标准&#xff0c;只要适配这套标准&#xff0c;就可以通过kubelet采集资源数据&#xff0c;并且通过k8s api服务器输出…

Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列

写在开头 队列是Java中的一个集合接口&#xff0c;之前的文章已经讲解了List和Set&#xff0c;那么今天就来唠一唠它吧。队列的特点&#xff1a;存储的元素是有序的、可重复的。 队列的两大接口Queue vs Deque Queue 是单端队列&#xff0c;只能从一端插入元素&#xff0c;另…

使用CompletableFuture在主线程捕获子线程异常

场景&#xff1a;我们使用线程池的时候&#xff0c;假如说某个线程出现了异常此时我们需要将异常捕获打印出相应的异常日志 这个时候就可以用到CompletableFuture的exceptionally方法&#xff0c;其作用是返回一个新的CompletableFuture&#xff0c;如果原CompletableFuture以…

电路设计(20)——数字电子钟的multism仿真

1.设计要求 使用数字芯片&#xff0c;设计一个电子钟&#xff0c;用数码管显示&#xff0c;可以显示星期&#xff0c;时、分、秒&#xff0c;可以有按键校准时间。有整点报警功能。 2.设计电路 设计好的multism电路图如下所示 3.芯片介绍 时基脉冲使用555芯片产生。在仿真里面…

UE5中的DataTable说明

创建DataTable 在编辑器中创建 在文件夹空白处右击&#xff0c;选择Miscellaneous/DataTable&#xff0c;如图&#xff1a; 使用代码创建 // 创建DataTable实例 UDataTable* MyDataTable NewObject(); // 创建一个行结构体 UStruct* RowStruct UStruct::CreateEmpty(); // 添…

[Flink01] 了解Flink

Flink入门系列文章主要是为了给想学习Flink的你建立一个大体上的框架&#xff0c;助力快速上手Flink。学习Flink最有效的方式是先入门了解框架和概念&#xff0c;然后边写代码边实践&#xff0c;然后再把官网看一遍。 Flink入门分为四篇&#xff0c;第一篇是《了解Flink》&…

【HarmonyOS】鸿蒙开发之Button组件——第3.4章

按钮类型 Capsule&#xff08;默认值&#xff09;&#xff1a;胶囊类型 Button("默认样式").height(40)//高度.width(90)//宽度.backgroundColor(#aabbcc)//背景颜色运行结果: Normal&#xff1a;矩形按钮&#xff0c;无圆角 Button({type:ButtonType.Normal}){Te…