已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络典型例题 Java 提供了两个不同层次的网络支持机制 利用 URL 访问网络资源 利用 Socket 通信 一 统一资源定位符 URL 类 1 URL 用来网络资源定位 它的值由 5 部分组成 格式如下所示 其中传输协议 protocol 指明获取资源所使用的传输 协议 如 http ftp file 等 http 表示通过 HTTP 访问网络 资源 ftp 表示通过网络协议 FTP 访问网络资源 file 表示 本机上文件 是所指定的资源 news 表示通过 NNTP 访问指定新闻地址的资源 主机名 hostname 指定资源所在的计算机 可以是 IP 地址 如 127 0 0 1 也可以是 主机名或域名 如 一个计算机中可能有多种服务 应用程序 端口号 port 用来区分不同的网络服务 如 http 服务的默认端口号是 80 ftp 服务的默认端口号是 21 等 理论上有 0 65535 个端口 其中 1024 号以下端口一般都给定了用途 例如 HTTP 使用 80 端口 FTP 默认 21 端口 Telnet 使用 23 端口 平常我们使用 1024 号以上端口 文件名 filename 包括该文件的完整路径 在 http 协议中 缺省的文件名是 index html 因此 就相等同于 引用 reference 为资源内的某个引用 用来定位显示文件内容的位置 如 URL 都包含这些元素 对于多数的 协议 主机名和文件名是必需的 但端口号和文件内部的引用则是可选的 2 URL 类位于 包中 是指向互联网资源的指针 使用 URL 可以通过给定的 URL 地址访问到需要的资源 资源可以是简单的文件和目录 也可以是对象的引用 对数 据库或搜索引擎的查询 URL 类的对象代表一个 URL 地址 URL 对象的创建示例 其构造方法 1 通过指定的 URL 字符串创建 URL 对象 URL gamelan new URL 2 通过指定的协议 主机地址 路径字符串创建 URL 对象 URL gamelan new URL http pages G html 3 通过指定的协议 主机地址 端口号 路径字符串创建 URL 对象 URL gamelan new URL http 80 pages Gwork html 上两种方法将一个 URL 地址分解 按不同部分分别指定协议 主机 端口 文件 4 通过指定的上下文中对指定的协议的解析创建对象 URL URL context String spec 这种方法基于一个已有的 URL 对象创建一个新的 URL 对象 多用于访问同一个主机上不 同路径的文件 例如 URL u1 new URL u tutorial intro html 创建 URL 后 可以对其操作 public int getDefaultItPort 获取与此 URL 关联的默认端口号 public String getFile 获取此 URL 的文件名 public String getHost 获取此 URL 的主机名 public String getPath 获取此 URL 的路径部分 public int getPort 获取此 URL 的端口号 public String getProtocol 获取此 URL 的协议名称 public String getQuery 获取此 URL 的查询部分 public InputStream openStream 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream 3 URLConnection 抽象类 该抽象类代表应用程序和 URL 之间的通信链接 创建一个到 URL 的连接步骤 1 对影响到远程资源连接的参数操作 通过在 URL 上调用 openConnection 方法创建 连接对象 2 除了设置参数和一般请求属性 3 使用 connect 方法建立到远程对象的实际连接 与资源交互 查询头字段和内容 4 远程对象变为可用 远程对象的头字段和内容变为可访问 建立到远程对象的连接后 可以使用以下方法对头字段和内容进行访问 public Object getContent throws IOException 获取此 URL 链接的内容 public String getHeaderField int n 获取指定头字段的值 public InputStream getInputStream throws IOException 获取输入流 如果读超时 会 抛出 SockeTimeoutException public OutputStream getOutputStream throws IOException 获取输出流 public String getContentEncoding 获取 content encoding 的值 public int getContentLength 获取 content length 的值 public String getContentType 获取 content type 的值 public long getDate 获取 date 的值 public long getLastModified 获取 last modified 的值 结果为距离格林威治标准时间 的毫秒数 以下是测试一例 import java io import import java util 写写 URL 的测试类 获取网站的信息 并将网站主页下载到本地磁盘上的测试类 获取网站的信息 并将网站主页下载到本地磁盘上 public class URLTest 主方法主方法 public static void main String args try 定义定义 urlName 的字符串 如果的字符串 如果 args 数组长度大于数组长度大于 0 则将 则将 args 0 的值赋的值赋 给给 urlName String urlName if args length 0 urlName args 0 URL url new URL urlName 创建创建 URL 对象对象 System out println 打印打印 url 的一些信息 的一些信息 System out println getProtocol url getProtocol 获取协议名称获取协议名称 System out println getthost url getHost 获取主机名称获取主机名称 System out println gettfile url getFile 获取此获取此 URL 的文件名的文件名 System out println getPath url getPath 获取路径获取路径 System out println getPort url getPort 获取端口号 未设置返回获取端口号 未设置返回 1 System out println getDefaultPort url getDefaultPort 返回默认端返回默认端 口号口号 URLConnection connection url openConnection 打开远程对象的连接 打开远程对象的连接 返回连接值返回连接值 connection connect 连接到服务器 打开此连接到服务器 打开此 URL 引用的资源的通信链接引用的资源的通信链接 获取并打印头字段的值获取并打印头字段的值 System out println 打印头字段信息 打印头字段信息 int n 1 String key while key connection getHeaderFieldKey n null String value connection getHeaderField n 返回第返回第 n 个头字段的值个头字段的值 System out println key value 打印头字段的键 值打印头字段的键 值 n 打印引用资源的一些属性打印引用资源的一些属性 System out println 打印引用资源的一些属性打印引用资源的一些属性 System out println getContentType connection getContentType 返回引用资源的内容类型返回引用资源的内容类型 System out println getContentLength connection getContentLength 返回引用资源的内容长度返回引用资源的内容长度 System out println getContentEncoding connection getContentEncoding 返回引用资源的内容编码返回引用资源的内容编码 返回引用资源的发送日期 为距离格林威治标准时间返回引用资源的发送日期 为距离格林威治标准时间 1970 年年 1 月月 1 日的日的 毫秒数 毫秒数 System out println getDate connection getDate 返回引用资源上次的修改日期 若未知返回返回引用资源上次的修改日期 若未知返回 0 System out println getLastModifed connection getLastModified 下载引用文件到本地磁盘 读取文件下载引用文件到本地磁盘 读取文件 BufferedReader in new BufferedReader new InputStreamReader connection getInputStream 打印输出源文件前打印输出源文件前 10 行行 String line n 1 while line in readLine null n if line null System out println 创建输出流 并指定目标文件创建输出流 并指定目标文件 BufferedWriter bw new BufferedWriter new FileWriter e URLTest html 对输出流做进一步进行封装对输出流做进一步进行封装 PrintWriter pw new PrintWriter bw 声明临时字符串引用声明临时字符串引用 String temps null 从输入流中获取资源并测试是否读取完毕从输入流中获取资源并测试是否读取完毕 while temps in readLine null 将获取的数据写如目标文件将获取的数据写如目标文件 pw println temps 打印提示信息打印提示信息 System out println 您好 网站主页已经下载完毕 已经写入了您好 网站主页已经下载完毕 已经写入了 URLTest html pw close 关闭输出流关闭输出流 in close 关闭输入流关闭输入流 catch IOException exception exception printStackTrace 二 Socket 编程 传统的 C S 模式的网络程序主要通过服务器端和客户端的网络连接来实现数据传输 服务器端和客户端的网络连接主要是 TCP Socket 连接 在 包中提供了 Socket 和 ServerSocket 类来实现连接 在 Socket 编程中发送方和接收方的两个 Socket 之间必须先连接 再才能在 TCP 协议 的基础上进行通信 服务器的任务就是等候建立一个连接 然后用那个连接产生的 Socket 创建一个 InputStream 以及一个 OutputStream 之后 从 InputStream 读入的所有东西都会反馈给 OutputStream 直到接收到行中止 END 为止 最后关闭连接 客户机连接与服务器的 连接 然后创建一个 OutputStream 文本行通过 OutputStream 发送 客户机也会创建一个 InputStream 用它收听服务器说些什么 服务器与客户机 程序 都使用同样的端口号 而且客户机利用本地主机地址连接位于同一台机器中的服务器 程序 所以不必在一个物 理性的网络里完成测试 注意 ServerSocket 只要一个端口编号 不需要 IP 地址 因为它就在这台机器上运 行 调用 accept 时 方法暂时陷入停顿状态 直到某个客户尝试同它建立连接 建好一 个连接以后 accept 会返回一个 Socket 对象 它是那个连接的代表 假如 ServerSocket 构 建器失败 则程序简单地退出 注意必须保证 ServerSocket 的构建器在失败之后不会留下 任何打开的网络套接字 针对这种情况 main 会 掷 出一个 IOException 违例 所以 不必使用一个 try 块 若 ServerSocket 构建器成功执行 则其他所有方法调用都必须到一 个 try finally 代码块里寻求保护 以确保无论块以什么方式留下 ServerSocket 都能正确 地关闭 同样的道理也适用于由 accept 返回的 Socket 若 accept 失败 那么我们必须保 证 Socket 不再存在或者含有任何资源 以便不必清除它们 但假若执行成功 则后续的语 句必须进入一个 try finally 块内 以保障在它们失败的情况下 Socket 仍能得到正确的清 除 由于套接字使用了重要的非内存资源 所以在这里必须特别谨慎 必须自己动手将它 们清除 无论 ServerSocket 还是由 accept 产生的 Socket 都打印到 System out 里 这意味着它们的 toString 方法会得到自动调用 这样便产生了 ServerSocket addr 0 0 0 0 PORT 0 localport 8080 Socket addr 127 0 0 1 PORT 1077 localport 8080 在后面的程序中大家会看到它们如何与客户程序做的事情配合 服务器端程序 mport java io import 写服务器端 对端口进行监听 接受客户端请求并为客户端服务 public class TcpServer public static void main String args 服务器对 8888 端口进行监听 接受到客户端连接请求后 创建和启动服务线程 long count 0 声明用来计数的变量 ServerSocket serverSocket null 声明服务器套接字 try serverSocket new ServerSocket 8888 创建绑定到 8888 端口的 ServerSocket 对象 System out println 服务器对 8888 端口实施监听 打印提示信息 服务器循环接收客户端的请求 为不同的客户端提供服务 while true Socket socket serverSocket accept 接收客户端的连接请求 若有连接 请求返回连接对应的 Socket 对象 count ServerThread serverThread new ServerThread socket count 创建服务器 线程 serverThread start 启动服务器线程 catch IOException e e printStackTrace 定义 ServerThread 类 继承自 Thread 类 class ServerThread extends Thread 根据客户端和计数器来创建服务器线程 Socket socket long count 构造方法 public ServerThread Socket socket long c this count c this socket socket 重写 run 方法 public void run int timeCounter 0 try InputStream ins socket getInputStream 获取套接字的输入流 InputStreamReader isr new InputStreamReader ins 封装输入流 BufferedReader br new BufferedReader isr 封装输入流 OutputStream os socket getOutputStream 获取套接字的输入流 PrintStream pw new PrintStream os 封装输出流 while true timeCounter 声明用来计数的变量 String str br readLine 定义字符串为读取 br 的值 if str equals exit 如果客户端输入的是 exit 则关闭客户端 pw println exit pw flush socket close break 告知客户端是第几次转换 有几个客户端 并输出转换的字符串 pw println 这是 socket toString 第 timeCounter 次发送转换请 求 现在有 count 个客户在线 转换后的字符串为 str toUpperCase pw flush catch IOException e e printStackTrace 客户端程序 import java io import Socket 客户端程序 public class TcpClient public static void main String args try Socket socket new Socket 127 0 0 1 8888 创建套接字 传入 IP 和端口 boolean flag true 定义布尔型变量 OutputStream os socket getOutputStream 返回套接字输出流 PrintStream ps new PrintStream os 封装输出流 InputStream ins socket getInputStream 返回套接字输入流 InputStreamReader isr new InputStreamReader ins 封装输入流 BufferedReader br new BufferedReader isr 封装输入流 String str null 定义字符串 获取输入的字符串 BufferedReader kbr new BufferedReader new InputStreamReader System in while flag 提示用户输入小写字母 服务器将转换成大写 System out println 请输入您要转换的小写字母 服务器将为您转换成 大写字母 System out print 请输入 String inputString kbr readLine 定义获取的字符串 ps println inputString 写到服务器端 if str br readLine null 读取数据 if str equals exit 如果输入 exit 退出循环 flag false System out println 服务器返回转换信息 str socket close 关闭客户端 catch Exception e e printStackTrace 本程序操作方法 开始 运行 CMD cd 到工作目录 打 start 产生二个 DOS 命令操作界面 分别在二个界 面中编译与执行服务器端程序和客户端程序 在客户端输入小写字母等 将显示将其中小 写字符变成大写字符的效果 三 UDP Socket 编程 UDP Socket 的信息传输方式类似于发传真 发送端先准备好要发送的资料 打电话给接收 端 接收端准备好纸张 回一个信号 再开始传真 数据报套接字 DatagramSocket 不需要 创建两个 Socket 不可以使用输入 输出流 import 定义 UDP 接收端 public class UDPServer public static void main String args byte bufferIn new byte 26 byte bufferOut try 建立信箱 创建数据包套接字并绑定到 13 端口 DatagramSocket ds new DatagramSocket 13 System out println UDP 接收端启动 在 13 端口 int num 0 while num 100 num 准备收件信封 接收长度为 length 的数据包 DatagramPacket packetIn new DatagramPacket bufferIn bufferIn length ds receive packetIn 收信 接受数据报 InetAddress ia packetIn getAddress 通过信封得到发信人的地址和端口 号 int port packetIn getPort 获取端口 String str new String bufferIn 获取字符串 str str toUpperCase 把字符串变成大写 bufferOut str getBytes 给输出数组赋值 System out println 收到的第 num 封信 来源 ip 是 ia toString 端口号为 port 发信的信封 DatagramPacket packetOut new DatagramPacket bufferOut bufferOut length ia port ds send packetOut 发信 回信 ds close catch Exception e e printStackTrace 客户端程序 import java io import 定义 UDP 发送端 public class UDPClient public static void main String args byte bufferOut new byte 26 byte bufferIn new byte 26 for int i 0 i 0 收到用户退出的系统信息 删除集合中对应项 通知所有用户 if msg startsWith SYSTEM MSG USER LOGOUT synchronized lock users remove this username sendAll SYSTEM MSG DELETE USER this username s close System out print rOnline online 收到聊天信息 解析出发送对象和信息内容 并发送 else touser msg substring 0 msg indexOf NAME END msg msg replaceFirst touser NAME END send msg touser 登陆时出现用户名已存在情况 通知用户 catch ExistException e out println SYSTEM MSG USER EXIST out flush catch Exception e finally try s close catch Exception e 发送信息给所有用户 2 private void sendAll String msg Set s users keySet Iterator it s iterator while it hasNext UserThread t UserThread users get it next if t this t sendUser msg 给本线程发送在线用户列表 private void listAll Set s users keySet Iterator it s iterator while it hasNext this sendUser SYSTEM MSG EXIST USERS it next 判断用户名是否已经有人使用 private boolean isExist String name Set s users keySet Iterator it s iterator while it hasNext if name equals String it next return true return false 给本线程对应的用户发信息 private void sendUser String msg out println msg out flush System out println to this username msg 调试用代 码 给指定对象发送信息 private void send String msg String touser 调用相应函数 给所有人发信息时 if touser equals All sendAll this username NAME END msg return 根据发送目标的名字获得相应线程 调用目标线程的函数给目标发送信息 if users containsKey touser 加判断 防止用户已经离线 UserThread users get touser sendUser MSG FROM this username NAME END msg 主方法 启动服务器 public static void main String args 根据参数的情况 获得端口号 无效时使用默认值 并返回相应信息 int port DEFAULT PORT if args length 0 int newport try newport Integer parseInt args 0 无效端口 if newport 65535 newport 0 System out println The port newport is invalid 操作系统预留端口 else if newport 1024 System out println The port 0 1024 is not allowed else port newport 不能转换成整数的参数 catch NumberFormatException e System out println Invalid port number try ServerSocket ss new ServerSocket port System out print Server is running nPort port nOnline 0 while true Socket s ss accept Thread t new UserThread s t start 端口绑定失败 catch IOException e System out println Failed to bind port port 3 客户端代码 聊天室客户端 public class Client 主方法 启动登陆线程 public static void main String args throws Exception Thread login new LoginThread login start 4 客户端登录线程 import java awt BorderLayout import java awt GridLayout import java awt event ActionEvent import java awt event ActionListener import java io BufferedReader import java io IOException import java io InputStream import java io InputStreamReader import java io OutputStream import java io OutputStreamWriter import java io PrintWriter import Socket import javax swing JButton import javax swing JFrame import javax swing JPanel import javax swing JTextField import lianxi Protocol ExistException import lianxi Protocol VersionException 登陆线程 public class LoginThread extends Thread implements Protocol private JFrame loginf private JTextField t public void run 设置登陆界面 loginf new JFrame loginf setLocation 300 200 loginf setSize 400 150 loginf setDefaultCloseOperation JFrame EXIT ON CLOSE loginf setTitle SOFTWARE 登陆 t new JTextField Version VERSION By Lindan t setHorizontalAlignment JTextField CENTER t setEditable false loginf getContentPane add t BorderLayout SOUTH JPanel loginp new JPanel new GridLayout 4 2 loginf getContentPane add loginp JTextField t1 new JTextField 登陆名 t1 setHorizontalAlignment JTextField CENTER t1 setEditable false loginp add t1 final JTextField loginname new JTextField loginname setHorizontalAlignment JTextField CENTER loginp add loginname JTextField t2 new JTextField 服务器 IP t2 setHorizontalAlignment JTextField CENTER t2 setEditable false loginp add t2 final JTextField loginIP new JTextField DEFAULT IP loginIP setHorizontalAlignment JTextField CENTER loginp add loginIP JTextField t3 new JTextField 端口号 t3 setHorizontalAlignment JTextField CENTER t3 setEditable false loginp add t3 final JTextField loginport new JTextField DEFAULT PORT loginport setHorizontalAlignment JTextField CENTER loginp add loginport 监听退出按钮 匿名内部类 JButton b1 new JButton 退 出 loginp add b1 b1 addActionListener new ActionListener public void actionPerformed ActionEvent e System exit 0 final JButton b2 new JButton 登 陆 loginp add b2 loginf setVisible true 监听器 监听 登陆 Button 的点击和 TextField 的回车 class ButtonListener implements ActionListener private Socket s public void actionPerformed ActionEvent e if checkName loginname getText try s new Socket loginIP getText Integer parseInt loginport getText 连接服务器 try InputStream is s getInputStream InputStreamReader ir new InputStreamReader is GBK java nio charset Charset defaultCharset BufferedReader in new BufferedReader ir OutputStream os s getOutputStream OutputStreamWriter or new OutputStreamWriter os GBK PrintWriter out new PrintWriter or out println VERSION out flush out println loginname getText out flush String ver if ver in readLine equals VERSION throw new VersionException ver if in readLine equals USER EXIST throw new ExistException 启动聊天线程 Thread chat new ChatThread loginname getText s in out loginf setVisible false loginf setEnabled false chat start catch IOException e1 流操作异常 t setText 通讯失败 请重试 try s close catch IOException e2 catch VersionException e3 用户存在异常 接口中定义 t setText e3 getMessage try s close catch IOException e4 catch ExistException e5 用户存在异常 接口中定义 t setText e5 getMessage try s close catch IOException e6 catch IOException e7 Socket 连接服务器异常 t setText 连接服务器失败 请重试 ButtonListener bl new ButtonListener b2 addActionListener bl loginname addActionListener bl loginIP addActionListener bl loginport addActionListener bl 判断登陆名是否有效 private boolean checkName String name if name length NAME MAX t setText 错误 登陆名不能大于 NAME MAX 字符 return false if name indexOf 1 t setText 错误 登陆名不能包含空格 return false for int i 0 i 1 t setText 错误 登陆名不能包含敏感信息 return false return true 5 聊天线程 import java awt BorderLayout import java awt event ActionEvent import java awt event ActionListener import java awt event WindowEvent import java awt event WindowListener import java io BufferedReader import java io IOException import java io PrintWriter import Socket import java util Date import java util HashMap import java util Map import javax swing JButton import javax swing JComboBox import javax swing JFrame import javax swing JPanel import javax swing JScrollPane import javax swing JTextArea import javax swing JTextField 聊天线程 class ChatThread extends Thread implements Protocol private Map users new HashMap private String name private Socket s private BufferedReader in private PrintWriter out private JComboBox cb private JFrame f private JTextArea ta private JTextField tf private static long time 上一条信息的发出时间 private static int total 在线人数统计 public ChatThread String name Socket s BufferedReader in PrintWriter out this name name this s s this in in this out out public void run 设置聊天室窗口界面 f new JFrame f setSize 600 400 f setTitle SOFTWARE name 当前在线人数 total f setLocation 300 200 ta new JTextArea JScrollPane sp new JScrollPane ta ta setEditable false tf new JTextField cb new JComboBox cb addItem All JButton jb new JButton 私聊窗口 JPanel pl new JPanel new BorderLayout pl add cb pl add jb BorderLayout WEST JPanel p new JPanel new BorderLayout p add pl BorderLayout WEST p add tf f getContentPane add p BorderLayout SOUTH f getContentPane add sp 监听私聊窗口按钮 匿名内部类 jb addActionListener new ActionListener public void actionPerformed ActionEvent e String name String cb getSelectedItem if name equals All ChatWindow cw ChatWindow users get name if cw fs isVisible cw fs setVisible false else cw fs setVisible true 监听关闭按钮 class MyWindowListener implements WindowListener public void windowActivated WindowEvent e public void windowClosed WindowEvent e public void windowClosing WindowEvent e 向服务器发送退出信息 out println SYSTEM MSG USER LOGOUT out flush try s close catch IOException e1 System exit 0 public void windowDeactivated WindowEvent e public void windowDeiconified WindowEvent e public void windowIconified WindowEvent e public void windowOpened WindowEvent e MyWindowListener wl new MyWindowListener f addWindowListener wl 接收服务器发送的信息 class GetMsgThread extends Thread public void run try String msg name while s isClosed 不断接受服务器信息 外层循环防止读到 null 跳出循环 while s isClosed 系统信息处理 if msg startsWith MSG FROM msg msg replaceFirst MSG FROM name msg substring 0 msg indexOf NAME END msg msg replaceFirst name NAME END JTextArea tas ChatWindow users get name tas tas append name 说 msg n tas setCaretPosition tas getText length ta append name 悄悄地对你说 msg n else if msg contains NAME END name msg substring 0 msg indexOf NAME END msg msg replaceFirst name NAME END ta append name 说 msg n 在窗口显示信 息 else ta append msg n ta setCaretPosition ta getText length 自动滚动到底部 catch Exception e out println SYSTEM MSG USER LOGOUT 当异常产生时向系 统发出退出信息 finally try s close catch IOException e GetMsgThread gt new GetMsgThread gt start 监听用户在公聊窗口输入的信息 匿名内部类 tf addActionListener new ActionListene
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市热岛效应的建筑形态调控研究综述
- 2026年门诊转诊信息登记管理细则
- 2026年外贸单证员业务考试试卷及答案
- 2026年盲板抽堵作业安全管理制度
- 预防性吸入肺炎的护理
- 抗疑血药物观察和护理
- 门诊护理质量考核标准
- 2026事业单位工勤技能-上海-上海中式烹调师三级(高级工)历年参考题库含答案详解
- 2026主任医师(正高)-妇女保健(正高)093历年题库含答案详解
- 2026临床医学期末复习-外科学总论(本科临床定向专业)历年题库含答案详解
- 2026新版检验检测机构管理评审报告
- 2026年西南电力设计院招聘考试指南及模拟题
- 选择性必修1 Unit 5 语法教学设计:《主语从句》
- 中英文产品研发项目合同协议
- 中国传统滚灯介绍
- 雷锋精神发源地
- 项目四 直流电动机与三相交流电动机性能检测
- 安全检查分析scl课件
- 辽宁省东北育才高中2025 - 2026学年度上学期高一上学期10月考语文试卷
- 农业机械化智能化发展现状下的农业人才培养模式研究报告
- CJ/T 454-2014城镇供水水量计量仪表的配备和管理通则
评论
0/150
提交评论