版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设计报告基于TCP的网络聊天室系统一、问题描述 题目:基于TCP的网络聊天室系统。在JAVA中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和服务器端的SeverSocket类。SeverSocket类的功能是建立一个Sever,并通过accent()方法随时监听客户端的连接请求。二、概要设计(抽象数据类型定义)import.*;importjava.io.*;publicclassNode{//用户链表结点 Stringusername=null; //用户昵称 Socketsocket=null; ObjectInputStreaminput=null; ObjectOutputStreamoutput=null; Nodenext=null;}流程图:三、详细设计(主要算法和函数间的调用关系) (1)Node.java 用户链接结点,包含用户名、Socket接口输入输出流和保存下一个用户结点的“指针” import.*;importjava.io.*;publicclassNode{//用户链表结点 Stringusername=null; Socketsocket=null; ObjectInputStreaminput=null; ObjectOutputStreamoutput=null; Nodenext=null;} (2)UserLinkList.java 对用户链表的操作,有添加用户、删除用户、根据用户名查找用户和根据索引查找用户。 publicclassUserLinkList{//用户链表操作 Nodehead; Nodepointer; intcount; publicUserLinkList(){//构造用户链表 head=newNode(); head.next=null; pointer=null; count=0;} publicvoidaddUser(Noden){//添加用户 pointer=head; while(pointer.next!=null){ pointer=pointer.next; } pointer.next=n; n.next=null; count++;} publicvoiddelUser(Noden){//删除用户 pointer=head; while(pointer.next!=null){ if(pointer.next==n){ pointer.next=n.next; count--; break; } pointer=pointer.next; }} publicintgetCount(){//返回用户数 returncount;} publicNodefindUser(Stringusername){//根据用户名查找用户 if(count==0)returnnull; pointer=head; while(pointer.next!=null){ pointer=pointer.next; if(pointer.username.equalsIgnoreCase(username)){ returnpointer; } } returnnull;} publicNodefindUser(intindex){//根据索引查找用户 if(count==0)returnnull; if(count<0)returnnull; pointer=head; inti=0; while(i<index+1){ if(pointer.next!=null)pointer=pointer.next; elsereturnnull; i++; } returnpointer;}} (3)ChatSever.java 服务器端的主程序,主要是服务器端的界面的和一些功能按钮,包括用户列表窗口、消息窗口、端口设置按钮、启动服务按钮、停止服务按钮和退出程序按钮。设置端口的功能是弹出一个对话框,在对话框架中改变端口再保存,所以设置端口对话框要在另一个类中实现,主程序中要把端口号定义为静态变量,可以让其他类以静态的方式引用。启动服务就是生成一个SeverSocket实例对象,初始化用户链表,调用监听客户端的连接请求的线程类。按下停止服务按钮,首先要向所有用户发送“服务关闭”信息,然后再关闭所有Socket接口和输入输出流。在退出程序之前,也要经过停止服务这个阶段。 importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;import.*;publicclassChatServerimplementsActionListener{ publicstaticintport=6666;//服务端的侦听口 ServerSocketserversocket;//服务端Socket JFrameframe; JMenuBarmenubar;//建立菜单栏 JMenuservicemenu;//建立菜单组//建立菜单项 JMenuItemportitem;//端口设置 JMenuItemstartitem;//启动服务 JMenuItemstopitem;//停止服务 JMenuItemexititem;//退出 JMenuhelpmenu; JMenuItemhelpitem;//帮助 JLabellabel; JPanelpanel; JScrollPaneuserscrollpane;//窗口滚动条 JScrollPanemessagescrollpane;//窗口滚动条 JTextAreausershow;//用户列表窗口 JTextAreamessageshow;//消息窗口 Dimensionframesize;//窗口的尺寸 Dimensionscreensize;//屏幕的尺寸 UserLinkListuserlinklist;//用户链表 ServerListenserverlisten;//端口侦听publicChatServer(){ frame=newJFrame("服务器"); Containercontentpane=frame.getContentPane(); frame.setLayout(newBorderLayout(5,10)); menubar=newJMenuBar(); frame.setJMenuBar(menubar); servicemenu=newJMenu("服务器"); menubar.add(servicemenu); portitem=newJMenuItem("端口设置"); startitem=newJMenuItem("启动服务"); stopitem=newJMenuItem("停止服务"); exititem=newJMenuItem("退出"); servicemenu.add(portitem); servicemenu.add(startitem); servicemenu.add(stopitem); servicemenu.add(exititem); stopitem.setEnabled(false);//初始时,令停止服务按钮不可用 //为菜单栏添加事件监听 portitem.addActionListener(this); startitem.addActionListener(this); stopitem.addActionListener(this); exititem.addActionListener(this); helpmenu=newJMenu("帮助"); menubar.add(helpmenu); helpitem=newJMenuItem("帮助"); helpmenu.add(helpitem); helpitem.addActionListener(this); label=newJLabel("在线人数聊天内容"); contentpane.add(label,BorderLayout.NORTH); usershow=newJTextArea(20,10);//用户列表窗口 usershow.setEnabled(false); userscrollpane=newJScrollPane//添加滚动条 (usershow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); contentpane.add(userscrollpane,BorderLayout.WEST); messageshow=newJTextArea(20,50);//消息窗口 messageshow.setEnabled(false); messagescrollpane=newJScrollPane//添加滚动条 (messageshow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); contentpane.add(messagescrollpane,BorderLayout.CENTER); frame.pack();//设置运行时窗口的位置framesize=frame.getSize();screensize=Toolkit.getDefaultToolkit().getScreenSize();intx=(int)(screensize.width-framesize.getWidth())/2;inty=(int)(screensize.height-framesize.getHeight())/2;frame.setLocation(x,y);frame.setResizable(false);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){ stopService(); System.exit(0);}});}publicvoidactionPerformed(ActionEvente){//事件处理 Objectobj=e.getSource(); if(obj==portitem)newSetPort(frame);//设置端口 elseif(obj==startitem)startService();//启动服务 elseif(obj==stopitem){//停止服务inti=JOptionPane.showConfirmDialog (frame,"真的停止服务吗?","停止服务", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(i==JOptionPane.YES_OPTION)stopService(); } elseif(obj==exititem){//退出 intj=JOptionPane.showConfirmDialog (frame,"真的要退出吗?","退出", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if(j==JOptionPane.YES_OPTION){ stopService(); System.exit(0); } } elseif(obj==helpitem)Help();}publicvoidstartService(){//启动服务 try{ serversocket=newServerSocket(port,30); messageshow.append("服务器已经启动"+""+"端口:"+port+'\n'); portitem.setEnabled(false); startitem.setEnabled(false); stopitem.setEnabled(true); userlinklist=newUserLinkList(); serverlisten=newServerListen(serversocket,usershow,messageshow,userlinklist); serverlisten.start(); } catch(Exceptione){ //System.out.println(e); } }publicvoidstopService(){//停止服务 try{ sendStopToAll();//发送停止服务给所有用户 intcount=userlinklist.getCount(); inti=0; while(i<count){ Nodenode=userlinklist.findUser(i);node.input.close();node.output.close();node.socket.close();i++; } serversocket.close(); portitem.setEnabled(true); startitem.setEnabled(true); stopitem.setEnabled(false); messageshow.append("服务端已经关闭\n"); usershow.setText(""); } catch(Exceptione){ //System.out.println(e); }}publicvoidsendStopToAll(){//发送停止服务给所有用户 intcount=userlinklist.getCount(); inti=0; while(i<count){ Nodenode=userlinklist.findUser(i); if(node==null){ i++; continue; } try{ node.output.writeObject("服务关闭"); node.output.flush(); } catch(Exceptione){ //System.out.println(e); } i++; }}publicvoidHelp(){ }publicstaticvoidmain(Stringargs[]){ newChatServer();}} (4)SeverListen.java 监听客户端的连接请求,当收到连接请求后,就开辟一个接口与之进行连接,并生成所需要的输入输出数据流,然后把用户添加到用户链表中,再调用服务器端发送和接收的线程类,这个类是继承Thread类。 importjavax.swing.*;importjava.io.*;import.*;publicclassServerListenextendsThread{//服务器端监听连接请求 ServerSocketserversocket;//服务器端的接口 JTextAreausershow;//用户列表窗口 JTextAreamessageshow;//消息窗口 UserLinkListuserlinklist;//用户链表 Nodeclient;//用户链表结点 ServerRecSenserverrecsen;//服务器端信息收发程序 publicServerListen(ServerSocketserversocket,JTextAreausershow, JTextAreamessageshow,UserLinkListuserlinklist){ this.serversocket=serversocket; this.usershow=usershow; this.messageshow=messageshow; this.userlinklist=userlinklist; } publicvoidrun(){//启动监听连接请求线程 while(!serversocket.isClosed()){ try{ client=newNode();//新建用户链表结点 client.socket=serversocket.accept();//监听客户端连接请求 client.output=newObjectOutputStream(client.socket.getOutputStream()); client.output.flush(); client.input=newObjectInputStream(client.socket.getInputStream()); client.username=(String)client.input.readObject(); usershow.append(client.username+'\n'); userlinklist.addUser(client); messageshow.append("欢迎用户<"+client.username+">来到8#A216宿舍聊天室\n"); serverrecsen=newServerRecSen(usershow,messageshow,userlinklist,client); serverrecsen.start(); } catch(Exceptione){ //System.out.println(e); } }}} (5)SeverRecSen.java 服务器端信息的发送与接收,这个类是实现把从某个用户中接受到的信息发送给其他用户的功能,因为这些功能不是按钮触发的,所以也要用线程实现。 importjavax.swing.*;publicclassServerRecSenextendsThread{//服务器端信息收发 JTextAreausershow;//用户列表窗口 JTextAreamessageshow;//消息窗口 UserLinkListuserlinklist;//用户链表 Nodeclient;//用户结点 publicServerRecSen(JTextAreausershow,JTextAreamessageshow, UserLinkListuserlinklist,Nodeclient){ this.usershow=usershow; this.messageshow=messageshow; this.userlinklist=userlinklist; this.client=client;} publicvoidrun(){//启动线程 sendUserList();//发送用户列表给所有用户 while(!client.socket.isClosed()){//接收消息 try{ Stringtype=(String)client.input.readObject(); if(type.equals("聊天消息")){//类型为聊天消息 Stringtosomebody=(String)client.input.readObject(); Stringstatus=(String)client.input.readObject(); Stringmessage=(String)client.input.readObject(); Stringmsg="<"+client.username+">对<"+tosomebody+ ">说:"+message+"\n"; if(status.equals("悄悄话")){ msg="[悄悄话]"+msg; }messageshow.append(msg);if(tosomebody.equals("所有人")){//发送消息给所有人 sendToAll(msg);}else{ try{//发送消息给发送方 client.output.writeObject("聊天消息"); client.output.flush(); client.output.writeObject(msg); client.output.flush(); } catch(Exceptione){ //System.out.println(e); } Nodenode=userlinklist.findUser(tosomebody); if(node!=null){//发送消息给接收方 node.output.writeObject("聊天消息"); node.output.flush(); node.output.writeObject(msg); node.output.flush(); }} } elseif(type.equals("用户下线")){//类型为用户下线 Nodenode=userlinklist.findUser(client.username); userlinklist.delUser(node); Stringmsg="用户<"+client.username+">下线\n"; intcount=userlinklist.getCount(); usershow.setText(""); inti=0; while(i<count){ node=userlinklist.findUser(i); if(node==null){ i++; continue; } usershow.append(node.username); i++; } messageshow.append(msg); sendToAll(msg); sendUserList(); break; } } catch(Exceptione){ //System.out.println(e); } }}publicvoidsendUserList(){//发送用户列表给所有用户 Stringuserlist=""; intcount=userlinklist.getCount(); inti=0; while(i<count){ Nodenode=userlinklist.findUser(i); if(node==null){ i++; continue; } userlist+=node.username; userlist+='\n'; i++; } i=0; while(i<count){ Nodenode=userlinklist.findUser(i); if(node==null){ i++; continue; } try{ node.output.writeObject("用户列表"); node.output.flush(); node.output.writeObject(userlist); node.output.flush(); } catch(Exceptione){ //System.out.println(e); } i++; }}publicvoidsendToAll(Stringmsg){//发送消息给所有用户 intcount=userlinklist.getCount(); inti=0; while(i<count){ Nodenode=userlinklist.findUser(i); if(node==null){ i++; continue; } try{ node.output.writeObject("聊天消息"); node.output.flush(); node.output.writeObject(msg); node.output.flush(); } catch(Exceptione){ //System.out.println(e); } i++; }}} (6)ChatClient.java 客户端的主程序,主要是客户端的界面和功能按钮,包括用户列表窗口、消息窗口、选择聊天用户对象的下拉式菜单。悄悄话复选框、要发送消息的文本框、发送按钮、设置按钮、选择按钮、断开按钮和关闭按钮。 importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;import.*;importjava.io.*;publicclassChatClientimplementsActionListener{publicstaticStringip="01"; publicstaticintport=6666;publicstaticStringusername="游客";Socketsocket;JFrameframe;JLabellabel;JPanelpanel;JScrollPaneuserscrollpane;//窗口滚动条JScrollPanemessagescrollpane;//窗口滚动条JTextAreausershow;//用户列表窗口JTextAreamessageshow;//消息窗口BoxBoxBoxJLabellabel1;JLabellabel2;JComboBoxuserlist;//选择发送消息的接收者JCheckBoxcheckbox;//悄悄话JTextFieldclientmessage;//客户端消息的发送JButtonsentmessage;//发送消息JButtonset;//设置IP,端口和用户名JButtonconnect;//连接服务器JButtoncut;//与服务器断开连接JButtonexit;//退出程序Dimensionframesize;//窗口的尺寸Dimensionscreensize;//屏幕的尺寸ObjectOutputStreamoutput;ObjectInputStreaminput;ClientReceiveclientrecsen;publicChatClient(){ frame=newJFrame("聊天");Containercontentpane=frame.getContentPane();frame.setLayout(newBorderLayout(5,10));label=newJLabel("在线人数聊天内容");contentpane.add(label,BorderLayout.NORTH);usershow=newJTextArea(20,10); usershow.setEnabled(false); userscrollpane=newJScrollPane (usershow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); contentpane.add(userscrollpane,BorderLayout.WEST); messageshow=newJTextArea(20,50); messageshow.setEnabled(false); messagescrollpane=newJScrollPane (messageshow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); contentpane.add(messagescrollpane,BorderLayout.CENTER); panel=newJPanel(); panel.setLayout(newGridLayout(3,1,0,10)); label1=newJLabel("对"); label2=newJLabel("说"); userlist=newJComboBox(); userlist.insertItemAt("所有人",0); userlist.setSelectedIndex(0); checkbox=newJCheckBox("悄悄话"); checkbox.setSelected(false); box1=Box.createHorizontalBox(); box1.add(label1); box1.add(userlist); box1.add(label2); box1.add(Box.createHorizontalStrut(480)); box1.add(checkbox);panel.add(box1);clientmessage=newJTextField();sentmessage=newJButton("发送");sentmessage.addActionListener(this);box2=Box.createHorizontalBox();box2.add(clientmessage);box2.add(Box.createHorizontalStrut(20));box2.add(sentmessage);panel.add(box2);set=newJButton("设置");set.addActionListener(this);connect=newJButton("连接");connect.addActionListener(this);cut=newJButton("断开");cut.setEnabled(false);cut.addActionListener(this);exit=newJButton("关闭");exit.addActionListener(this);box3=Box.createHorizontalBox();box3.add(Box.createHorizontalStrut(60));box3.add(set);box3.add(Box.createHorizontalStrut(100));box3.add(connect);box3.add(Box.createHorizontalStrut(100));box3.add(cut);box3.add(Box.createHorizontalStrut(100));box3.add(exit);panel.add(box3); contentpane.add(panel,BorderLayout.SOUTH); frame.pack();//设置运行时窗口的位置framesize=frame.getSize();screensize=Toolkit.getDefaultToolkit().getScreenSize();intx=(int)(screensize.width-framesize.getWidth())/2;inty=(int)(screensize.height-framesize.getHeight())/2;frame.setLocation(x,y);frame.setResizable(false);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){Cut(); System.exit(0);}});}publicvoidactionPerformed(ActionEvente){//事件处理 Objectobj=e.getSource(); if(obj==sentmessage)SentMessage(); elseif(obj==set)newSet(frame); elseif(obj==connect)Connect(); elseif(obj==cut){ inti=JOptionPane.showConfirmDialog (frame,"真的断开吗?","断开", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(i==JOptionPane.YES_OPTION)Cut(); } elseif(obj==exit){ inti=JOptionPane.showConfirmDialog (frame,"真的要关闭吗?","关闭", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(i==JOptionPane.YES_OPTION){ Cut(); System.exit(0);} }}publicvoidConnect(){//连接到服务器 try{ socket=newSocket(ip,port);} catch(Exceptione){ JOptionPane.showConfirmDialog(frame,"不能连接到指定服务器.\n请确认连接设置是否正确.", "提示",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE); return; } try{ set.setEnabled(false); connect.setEnabled(false); cut.setEnabled(true); messageshow.append("连接服务器成功\n"); output=newObjectOutputStream(socket.getOutputStream()); output.flush(); input=newObjectInputStream(socket.getInputStream()); output.writeObject(username); output.flush(); clientrecsen=newClientReceive(socket,usershow,messageshow, userlist,output,input,set,connect,cut); clientrecsen.start(); } catch(Exceptione){ //System.out.println(e); }}publicvoidCut(){//断开与服务器的连接 set.setEnabled(true); connect.setEnabled(true); cut.setEnabled(false); try{ if(socket.isClosed())return; output.writeObject("用户下线");//发送用户下线消息给服务器 output.flush(); output.close(); input.close(); socket.close(); messageshow.append("已经与服务器断开连接..."); } catch(Exceptione){ //System.out.println(e); }}publicvoidSentMessage(){//发送聊天消息 Stringtosomebody=userlist.getSelectedItem().toString(); Stringstatus=""; if(checkbox.isSelected())status="悄悄话"; Stringmsg=clientmessage.getText(); if(socket.isClosed()){ return; } try{ output.writeObject("聊天消息"); output.flush(); output.writeObject(tosomebody); output.flush(); output.writeObject(status); output.flush(); output.writeObject(msg); output.flush(); } catch(Exceptione){ //System.out.println(e); } clientmessage.setText("");}publicstaticvoidmain(Stringargs[]){ newChatClient();}}(7)Set.java 设置用户名、服务器IP地址和端口号。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSetimplementsActionListener{//设置用户名,IP地址和端口Stringport;//端口号JDialogdialog;//对话框JPanelpanel1;JPanelpanel2;JPanelpanel3;JPanelpanel4;JLabellabel1;JLabellabel2;JLabellabel3;JLabeltip;JTextFieldipaddress;//IP地址文本框JTextFieldportnumber;//端口号文本框JTextFieldusername;//用户名文本框JButtonsave;//保存JButtoncancel;//取消Dimensiondialogsize;//对话框的尺寸Dimensionscreensize;//窗口的尺寸publicSet(JFrameframe){ dialog=newJDialog(frame,"连接",true); Containercontentpane=dialog.getContentPane(); panel1=newJPanel(); panel1.setLayout(newGridLayout(3,0)); label1=newJLabel("IP:"); label1.setHorizontalAlignment(SwingConstants.RIGHT); label2=newJLabel("端口:"); label2.setHorizontalAlignment(SwingConstants.RIGHT); label3=newJLabel("用户名:"); label3.setHorizontalAlignment(SwingConstants.RIGHT); panel1.add(label1); panel1.add(label2); panel1.add(label3); contentpane.add(panel1,BorderLayout.WEST); panel2=newJPanel(); panel2.setLayout(newGridLayout(3,0)); ipaddress=newJTextField(ChatClient.ip,15); port=String.valueOf(ChatClient.port); portnumber=newJTextField(port,15); username=newJTextField(ChatClient.username,15); panel2.add(ipaddress); panel2.add(portnumber); panel2.add(username); contentpane.add(panel2,BorderLayout.EAST); panel3=newJPanel(); panel3.setLayout(newGridLayout(2,1)); tip=newJLabel("默认设置"); panel3.add(tip); panel4=newJPanel(); save=newJButton("保存"); save.addActionListener(this); cancel=newJButton("取消"); cancel.addActionListener(this); panel4.add(save); panel4.add(cancel); panel3.add(panel4); contentpane.add(panel3,BorderLayout.SOUTH); dialog.pack(); dialogsize=dialog.getSize();screensize=Toolkit.getDefaultToolkit().getScreenSize();intx=(int)(screensize.width-dialogsize.getWidth())/2;inty=(int)(screensize.height-dialogsize.getHeight())/2;dialog.setLocation(x,y);dialog.setResizable(false); dialog.setVisible(true);}publicvoidactionPerformed(ActionEvente){//事件处理 Objectobj=e.getSource(); if(obj==save){ intsaveport,ippoint=0,ipflag=1,portflag=1; Stringipstring; ipstring=ipaddress.getText(); for(inti=0;i<ipstring.length();i++){ if(ipstring.charAt(i)!='.'){ inttemp=ipstring.charAt(i)-'0'; if(temp<0||temp>9){ ipflag=0; break; } } elseippoint++; } if(ippoint!=3)ipflag=0; if(ipflag==0){//检查输入IP地址格式是否正确 tip.setText("IP地址格式不正确,请重新输入!"); return; } try{ saveport=Integer.valueOf(portnumber.getText()).intValue(); if(saveport<1024||saveport>65535){//检查输入端口是否在范围内 tip.setText("端口号必须是1024-65535之间的整数"); portflag=0; return; } } catch(Exceptiona){ tip.setText("错误的端口号,端口号请填写整数!"); portflag=0; return; } if(ipflag==1&&portflag==1){ ChatClient.ip=ipaddress.getText(); ChatClient.port=saveport; ChatClient.username=username.getText(); dialog.dispose(); } } elseif(obj==cancel)dialog.dispose();}}(8)ClientReceive.java客户
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 臭氧大自血疗法在重症监护中的应用
- 黑龙江省哈尔滨市香坊区2026年初三下学期第一次联考数学试题含解析
- 江西南昌市心远中学度重点中学2026年初三1月期末考前模拟数学试题文试题含解析
- 外科休克的病因与发病机制
- 肝衰竭患者的营养支持方案
- 胆管癌术后康复评估
- 脑卒中急救中的伦理问题
- 老年骨质疏松的护理策略
- 审计局红黑榜制度
- 商场招商绩效考核制度
- 2026年教育局思想政治工作科工作计划
- 2025年安徽卫生健康职业学院单招职业适应性测试试题及答案解析
- 医保村卫生室管理制度
- 陕西从优 秀村干部中考录乡镇公务员考试真题
- 2025年军事设施建设与管理规范
- 儿科学营养性vitD缺乏
- 《石油化工项目可行性研究投资估算编制办法》
- 2022上海金融信息产业发展报告
- 医院行风建设应知应会考核试题及答案
- 脱硝催化剂安装施工方案1026
- GB 24790-2009电力变压器能效限定值及能效等级
评论
0/150
提交评论