下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计网络聊天室院係)别 信电学院班 级计算102学号姓名指导教师时间2013-4-182013-5-10课程设计任务书题 目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102学生姓名 学 号4月 18 日至 5 月 10 日共 4 周指导教师(签字)系主任(签字)设计内容及要求、设计原始资料1)电子工业出版社JSP实用教程,郑阿奇编著2)电子工业出版社JAVA程序设计实用教程,叶核亚编著三、设计完成后提交的文件和图表1 计算说明书部分JSP界面设计2 图纸部分:程序流程图四、进程安排五、主要参考资料1)电子工业出版社JSP实用教程,郑阿奇编著2)电子工业出版社JAVA
2、程序设计实用教程,叶核亚编著考资料成绩评定表作品成绩报告成绩口试(答辩)成绩总评成绩目录课程设计概述 31.1 问题描述 31.2 功能需求分析 31.3 环境需求分析 3学生信息管理系统软件总体设计 42.1 整体思路 42.2 总体设计流程图 5学生信息管理软件详细设计 63.1.界面设计 63.2 通信功能实现方法 8参考文献 44摘要私達実践能力花高恥了込学人疋知識花運用行。疋更尤創造LT>学校怎特尤2週間手配LT>私達尤Visual C+D課程設計実習花行 袒乜求r.0770 詳OS説明怎 Visual C+6.0 環境下100V7bxTO 過程花設計LT>OV7b
3、xT各種O'一夕O個数花統計LOToOV7bxTO機能二一廿'一怎1段O文字花入力LT>V7bxT 怎文字O中O各類O尸一夕O数花記録LT、英文O尸一夕O数、数字O尸一夕O数、空欄o尸一夕o数<no夕彳夕o数花含明乙力、広 示l求r .以下、課程花通LT説明花設計LT、'一夕V7bxTO説明花統計LT、7°口厶怎説明花調整LT、総括XO方面花開発LT、詳L<oy 口厶 O製作O過程花説明LT、作用、各種O実行操作 关键字:'一夕O統計,VC+6.0,课程设计概述1.1 问题描述'随着计算机网络日新月异的发展,人们的交流方式越来
4、越多,传统的交流方式,如: 信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联 系,已经成为当今社会人们主流的联系方式。因此,两台计算机之间进行即时通讯、 发送文件等交流方式已经成为必然潮流。因此出现了QQ等聊天工具,然而QQ等聊 天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程 度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。目前, 用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对 的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。为此, 我决定开发一个专用于实现两台计算机之间
5、即时通讯、文件共享的软件,以方便两台 计算机之间信息的交流。避免了服务器忙或与服务器无法连接时,浪费过多时间用于 和服务器建立连接。因此,这个软件是极具适应性和实用性的即时通讯软件。1.2 功能需求分析实现网络聊天的功能,采用 Windows Socket (或Java Socket编程,服务器与客户端 采用了 TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端, 再由服务 器进行处理,服务器端是所有信息的中心。服务器端要保存用户信息,可利用数据库 来实现这一功能,需要建立用户信息数据库。在客户端可采用文件系统保存聊天纪录 和用户号码。可通过闪动托盘图标和播放不同的音乐提示信息到
6、来及好友上线等信 息。可通过建立消息链表来保存用户接收的各种消息。1.3 环境需求分析运行环境: Windows 9x、 2000、XP、Windows 7必要环境: JDK 1.6以上、 eclipse 开发环境硬件环境:CPU 400MHz以上,内存512MB以上学生信息管理系统软件总体设计2.1 整体思路该 C/S 模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起 连接请求。当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客 户之间的通信。对于整体系统的流程, 也是分为两部分, 即客户端的发起请求, 服务器响应请求。 首先是客户端的登陆,客户端在登陆时,必须
7、设置所想要连接的服务器,然后客户端 就会根据设置的服务器 IP 地址,向服务器发起建立连接请求。 而服务器端是始终在监 听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一 个服务线程,用于处理它的各种请求。对于客户端的各种请求, 实际上都是通过在客户发往服务器的各种字符流区分的, 具体的方法就是在消息的头部以及尾部添加特殊字符串, 从而实现服务器对消息请求 的识别。比如对于登陆信息,消息的头部就是“ PEOPLO” ,而对于私聊中的消息,头 部就是“ SEC,其他的同理都添加了头部。当然,对于客户端来说,这些都是透明的, 用户的操作并没有受到任何影响。在服务器端,消息被
8、检测分析后,变回根据具体的 目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发 该条消息。这里额外要说的是,该系统特别的对用户发来的消息进行了加密处理,即用户的 各种具体信息,不仅能够防止向第三方的泄漏,而且即使服务器端出现异常,信息也 不会泄漏。对于私聊的方式,该系统所采用的方法类似于 QQ 的通信方式,由发起方主动连 接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而实现私聊。22总体设计流程图ServerClie nt建立服务器1、建立连接/1等待并接收*_ . 创建socket接收请求后创建socket连接开始通信,F、,Inputstream 7 %&
9、quot; PutStream H OutpujtStream Outputstream 关闭socket 1结束通信关闭socket学生信息管理软件详细设计3.1.界面设计由于这里界面设计源代码比较简单,这里不再列出3.1.1服务器界面设计服务器界面3.1.2客户端界面设计登陆界面注册界面 aawV L, J V > J J Ji XIZ XW- J ji聊天室界面3.2通信功能实现方法列举部分实现通信功能的主要代码AppServer.java 文件public class AppServerexte nds Thread privateServerSocketserverSocket
10、privateServerFramesFrame;privatestatic VectoruserO nli nenew Vector(1, 1);private static Vector v = new Vector(1, 1);*异常/*创建服务器 启动服务监听 1001 端口*/public AppServer() sFrame = new ServerFrame();try serverSocket = new ServerSocket(1001);/ 获取服务器的主机名和 IP 地址InetAddress address = InetAddress.getLocalHost ();
11、sFrame . txtServerName .setText(address.getHostName(); sFrame . txtIP .setText(address.getHostAddress();sFrame . txtPort .setText( "1001" ); catch (IOException e) fail (e, " 不能启动服务! ");sFrame . txtStatus .setText( " 已启动 ." );this .start(); / 启动线程/*退出服务器param e* param st
12、r* 退出信息*/public static void fail(Exception e, String str) System. out .println(str + " 。 " + e);/* 监听客户的请求,当有用户请求时创建 Connection 线程*/public void run() try while ( true ) / 监听并接受客户的请求Socket client =serverSocket .accept();new Connection( sFrame , client,userOnline , v); / 支持多线程/ System.out.pr
13、intln("userLength:"+userLength); catch (IOException e) System. out .println(" 不能监听 " );/*启动服务器*/public static void main( Stri ng args) new AppServer();ServerFrame.java 文件public class ServerFrameexte nds JFrame impleme nts Action Liste ner public JList list ;*/private static final
14、longserialVers ion UID-8936397327038098620L;/服务器信息面板JPa nel pnl Server , pnl ServerI nfoJLabel lblStatus , IblNumber , IbIMax , IblServerName , lblProtocol lblIPlblPort , lblLogpublicJTextFieldtxtStatus,txtNumber ,txtMax ,txtServerNametxtProtocol,txtIP ,txtPort ;JButtonbt nStop,btn SaveLogpublicText
15、AreataLog ;JTabbedPa ne tpServer ;public TextArea taMessage ;/用户信息面板JPanel pnlUser ;public JLabel lblMessage , lblUser , lblNotice , IblUserCou ntJList lstUser ;JScrollPane spUser ;JTextField txtNotice ;JButtonbtnSend , btnKickpublic String serverMessage =public ServerFrame() / 服务器窗口super ( "Ha
16、ppyChat 聊天服务器 " ); setSize(550, 500);EXIT_ON_CLOSE);setDefaultCloseOperation(JFrame.setResizable( false );Dimension scr =Toolkit. getDefaultToolkit ().getScreenSize(); / 在屏幕居中显示Dimension fra = this .getSize();if (fra. width > scr. width ) fra. width = scr. width ;if (fra. height > scr. he
17、ight ) fra. height = scr. height ;this .setLocation(scr. width - fra. width ) / 2,(scr. height - fra. height ) / 2);/ = 服务器信息面板 = pnlServer = new JPanel();pnlServer .setLayout( null );pnlServerInfo = new JPanel( new GridLayout(14, 1);pnlServerInfo .setBorder(BorderFactory. createCompoundBorder (Bord
18、erFactory. createTitledBorder ("" ), BorderFactory. createEmptyBorder (1, 1, 1, 1);lblStatus = new JLabel( " 当前状态 :" );txtStatus = new JTextField(10);txtStatus .setEditable( false );lblNumber = new JLabel( " 当前在线人数 :" );txtNumber = new JTextField( "0 人 " , 10)
19、;txtNumber .setEditable( false );lblMax = new JLabel( " 最多在线人数 :" );txtMax = new JTextField( "50 人 " , 10);txtMax .setEditable( false );lblServerName = new JLabel( " 服务器名称 :" );txtServerName = new JTextField(10);txtServerName .setEditable( false );lblProtocol = new JLab
20、el( " 访问协议 :" );txtProtocol = new JTextField( "HTTP" , 10);txtProtocol .setEditable( false );lblIP = new JLabel( " 服务器 IP:" );txtIP = new JTextField(10);txtIP .setEditable( false );lblPort = new JLabel( " 服务器端口 :" );txtPort = new JTextField( "8000" ,
21、 10);txtPort .setEditable( false );btnStop = new JButton( " 关闭服务器 (C)" );btnStop .addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) closeServer(););lblLog = new JLabel( " 服务器日志 " );taLog = new TextArea(20, 50);btnSaveLog = new JButton( " 保存
22、日志 (S)" );btnSaveLog .addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) saveLog(););pnlServerInfo.add( lblStatus );pnlServerInfo.add( txtStatus );pnlServerInfo.add( lblNumber );pnlServerInfo.add( txtNumber );pnlServerInfo.add( lblMax );pnlServerInfo.add( txtMa
23、x );pnlServerInfo.add( lblServerName );pnlServerInfo.add( txtServerName );pnlServerInfo.add( lblProtocol );pnlServerInfo.add( txtProtocol );pnlServerInfo.add( lblIP );pnlServerInfo.add( txtIP );pnlServerInfo.add( lblPort );pnlServerInfo.add( txtPort );pnlServerInfo.setBounds(5, 5, 100, 400);lblLog .
24、setBounds(110, 5, 100, 30); taLog .setBounds(110, 35, 400, 370); btnStop .setBounds(200, 410, 120, 30); btnSaveLog .setBounds(320, 410, 120, 30); pnlServer .add( pnlServerInfo ); pnlServer .add( lblLog ); pnlServer .add( taLog ); pnlServer .add( btnStop );pnlServer .add( btnSaveLog );/在线用户面板pnlUser
25、= new JPanel();pnlUser .setLayout( null );lblMessage = new JLabel( " 用户消息 " ); taMessage = new TextArea(20, 20);lblNotice = new JLabel( " 通知: ");txtNotice = new JTextField(20);btnSend = new JButton( " 发送 (S)" );btnSend .setEnabled( true );btnSend .addActionListener(new
26、ActionListener() public void actionPerformed(ActionEvent arg0) serverMessage(););lblUserCount = new JLabel( " 在线总人数 0 人 ");btnKick = new JButton( " 踢人 (K)" );btnKick .addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) tiRen(););lblUser = new JLab
27、el( " 在线用户列表 " );IstUserIstUser .setVisibleRowCou nt(17);/指定的固定单元格宽度值,而不IstUser .setFixedCellWidth(180);是从列表兀素计算而来的宽度值lstUser .setFixedCellHeight(18);spUser = new JScrollPa ne();VERTICAL_SCROLLBAspUser .setVerticalScrollBarPolicy(JScrollPane.R_ALWAYSspUser .getViewport().setView(lstUser );
28、lblMessage .setBou nds(5, 5, 100, 25); taMessage .setBounds(5, 35, 300, 360); lblUser .setBou nds(310, 5, 100, 25);spUser .setBounds(310, 35, 220, 360); lblNotice.setBounds(5, 410, 40, 25);txtNotice.setBou nds(50, 410, 160, 25);btnSend .setBounds(210, 410, 80, 25); lblUserCount.setBounds(320, 410, 1
29、00, 25);btn Kick .setBou nds(440, 410, 80, 25);pnlUser .add( lblMessage );pnlUser .add( taMessage );pnlUser .add( lblUser );pnlUser .add( spUser );listlist .setListData(new"" );spUser .setViewportView( list );pnlUser .add( IblNotice);pnlUser .add( txtNotice);pnlUser .add( btnSend );pnlUser
30、 .add(lblUserCou nt);pnlUser .add( btnKick );TOP);/ = 主标签面板tpServer = new JTabbedPa ne(JTabbedPa ne. tpServer .add("服务器管理 ”,pnIServer ); tpServer .add("用户信息管理 ”,pnlUser ); this .getContentPane().add(tpServer );setVisible( true );protected void serverMessage() / TODO自动生成方法存根this . serverMes
31、sage = txtNotice .getText();txtNotice .setText("");protected void closeServer() / TODO自动生成方法存根this .dispose();/this.resprotected void saveLog() / TODO自动生成方法存根try FileOutputStream fileoutput =newFileOutputStream( "log.txt" ,true );String temp = taMessage .getText();fileoutput.writ
32、e(temp.getBytes();fileoutput.close();JOptionPane. showMessageDialog ( null , " 记录保存在 log.txt" ); catch (Exception e) System. out .println(e);protected void tiRen() / TODO自动生成方法存根log( "Ti:" +ti );private void log(String string) / TODO自动生成方法存根String newta = taMessage .getText();new
33、ta += ( "n" +string);taMessage .setText(newta);public void actionPerformed(ActionEvent evt) public static void main(String args) new ServerFrame();Connection.java 文件public class Connection extends Thread * 与客户端通讯 Socket*/private Socket netClient/*在线用户列表*/private Vector<Customer>userO
34、 nli ne/*聊天信息*/private Vector<Chat> userChat/*从客户到服务器输入流*/private ObjectI nputStream fromClie nt*传到客户端打印流*/toClie ntprivatePrin tStream/*注册用户列表new Vector。;*/private static Vector vList/*临时对象*/private Object obj*服务器日志窗体*/private ServerFrame sFrame;SuppressWarnings ( "unchecked")/*创建与客
35、户端通讯*/public Conn ecti on( ServerFrame frame, Socket clie nt. Vector u,Vector c) n etClie nt= clie nt;userO nli ne = u;userChat = c;sFrame = frame;try /发生双向通信/检索客户输入fromClie nt = newObjectI nputStream(n etClie nt.getl nputStream();/服务器写到客户toClie nt = new Prin tStream(n etClie nt .getOutputStream();
36、catch (lOException e) try n etClie nt.close(); catch (IOException e1) System. out .println("不能建立流"+ e1);return ;this .start();/*处理与客户端的通讯线程*/public void run() try / obj 是Object类的对象"Register_Customer" )obj = (Object) fromClie nt .readObject();if ( obj .getClass().getName().equals(
37、"Customer" ) /serverLogi n();serverLogi nDB();if (obj .getClass().getName().equals(/serverRegiste();serverRegisteDB();"Message" ) if ( obj .getClass().getName().equals(serverMessage();if ( obj .getClass().getName().equals( "Chat" ) serverChat();if ( obj .getClass().getN
38、ame().equals( "Exit" ) serverExit(); catch (IOException e) System. out .println(e); catch (ClassNotFoundException e1) System. out .println( "读对象发生错误! " + e1); finally try netClient .close(); catch (IOException e) System. out .println(e);/*登录处理*/SuppressWarnings ( "deprecatio
39、n")public void serverLogin() try obj ;Customer clie ntMessage2 = (Customer)/读文件FileI nputStream file3 =new FileI nputStream( "user.txt" );ObjectI nputStream objl nput1 =newObjectI nputStream(file3);vList = (Vector) objln put1.readObject();int find = 0;/ 查找判断标志/ System.out.pr intln(fin
40、 d);for (int i = 0; i < vList .size(); i+) Register_Customer reg = (Register_Customer)vList .eleme ntAt(i);custName ) if (reg. custName .equals(clientMessage2.find = 1;ifcustPassword ) (!reg. custPassword .equals(clie ntMessage2.(clie ntMessage2.);toClient.println(” 密码不正确”);break ; else /判断是否已经登录
41、int logi n_flag = 0;for (int a = 0; a < userOnline .size(); a+) / che nminStri ng _custName = (Customer)userO nli ne.elementAt(a).custName ;ifcustName .equals(_custName) logi n_flag = 1;break ; if ( userOnline .size() >= 50) toClient.println("登录人数过多,请稍候再试break ; if (login_flag = 0) client
42、Message2.custHead = reg. head ; /getUserHeadByName(clie ntMessage2.custName);userO nli ne .addEleme nt(clie ntMessage2);toClient.println( "登录成功");Date t = new Date();"登录log("用户"+ clientMessage2.custName +成功,"n");+ "登录时间:"+ t.toLocaleString() +freshServerU
43、serList();break ; else toClient.println("该用户已登录"); else con ti nue ;if (find = 0) toClient.println("没有这个用户,请先注册");file3.close();objl nput1.close();fromClient .close(); catch (ClassNotFoundException e) System. out .println(e); catch (IOException e) System. out .println(e);/* 登录处理*
44、 throws Exception*/SuppressWarnings ( "deprecation" ) public void serverLoginDB() try Customer clientMessage2 = (Customer) obj ;custName ;custPasswordString name = clientMessage2.String pass = clientMessage2.String sql = "selectfrom yonghu where custName='"+ nameResultSet rs
45、= DB.executeQuery (sql);System. out .println( "sql:" + sql); boolean login =false ;String head= "" ;while (rs.next() String ps=rs.getString("custPassword" ).toString();System. out .println("ps:" +ps+ "" );System. out .println("pass:" +pass+
46、 "" );if (ps.equals(pass.toString() login = true ;System. out .println( "logined:" );System. out .println("compareTo:" +pareTo(pass);head=rs.getString("head" );System. out .println("head:" +rs.getString( "head" );System. out .println( "
47、;login:" +login);if (!login) toClient .println( " 密码不正确 " ); return ;/ 判断是否已经登录Iog("用户"+ clientMessage2.custName + "登录成功,"+int login_flag = 0;for ( int a = 0; a <userOnline .size(); a+) String _custName = (Customer)userOnline .elementAt(a). custName ;if (clientM
48、essage2.custName .equals(_custName) login_flag = 1;break ;if ( userOnline .size() >= 50) toClient .println(" 登录人数过多,请稍候再试 ");return ;if (login_flag = 0) System. out .println( "head:" +head);clientMessage2. custHead =head; /getUserHeadByName(clientMessage2.custName);userOnline
49、.addElement(clientMessage2);toClient .println("登录成功 " );Date t = new Date();登录时间:"+ t.to"n");freshServerUserList();return ; else toClient.println("该用户已登录");fromClie nt .close();catch (Excepti on e) e.pri ntStackTrace();/*刷新服务器日志窗体在线列表*/private void freshServerUserL
50、ist() Str in g userList =new Strin g50;Customer cus =n ullfor ( int j = 0; j <userO nli ne.size(); j+) cus = (Customer)userO nli ne.get(j);userListj = cus.custName ;sFramest .setListData(userList);sFrame. txtNumber .setText(+ user On li ne.size();sFrame . IblUserCount .setText( user On li ne.size
51、();"当前在线人数:"+/ System.out.pri ntln ("fresh ok");*注册处理*/SuppressWarnings ( "unchecked" , "deprecation")public void serverRegiste() try int flag = 0;/ 是否重名判断标志Register_Customerclie ntMessage= (Register_Customer)File fList = new File( "user.txt" );if (f
52、List.length() != 0)/判断是否是第一个注册用户obj ;ObjectI nputStream objl nput =new ObjectI nputStream(new FilelnputStream(fList);vList = (Vector) objl nput.readObject();/判断是否有重名for (int i = 0; i <vList .size(); i+) Register_Customer reg = (Register_Customer)vList.elementAt(i);if (reg. custName .equals(client
53、Message. custName ) toClient .println(" 注册名重复 , 请另外选择 ");flag = 1;break ; else if (reg. custName .equals( " 所有人 ") toClient .println(" 禁止使用此注册名 , 请另外选择 " );flag = 1;break ;if (flag = 0) / 添加新注册用户vList .addElement(clientMessage);/ 将向量中的类写回文件FileOutputStream file =new Fil
54、eOutputStream(fList);ObjectOutputStream objout = newObjectOutputStream(file);objout.writeObject( vList );/ 发送注册成功信息toClient .println(clientMessage. custName + " 注册成功 "); Date t = new Date();log("用户"+ clientMessage.custName + "注册成功,"I!注册时间:"+ t.to"n");file
55、.close();objout.close();fromClie nt.close(); catch (ClassNotFoundException e) System. out .println(e); catch (IOException e) System. out .println(e);/*注册处理*/SuppressWarnings ( "unchecked" , "deprecation")public void serverRegisteDB() try int flag = 0;/ 是否重名判断标志obj ;Register_Customer clie ntMessage = (Register_Customer)Stri ng sql = "select * from yon ghu where custName='"+ clie ntMessage.custName +innResultSet rs = DB.executeQuery (sql);System. out .println( "sql:" + sql); boolean reg = false ;whil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内部劳务分包合同纠纷的解决方法探讨
- 投标过程中的诚信实践
- 浙江省杭州市高桥初中教育集团2024-2025学年上学期九年级期中数学试卷(无答案)
- 八年级历史下册 第3课 土地改革教案 新人教版
- 广东省肇庆市高中英语 Unit 2 Working the land-Ving form for Subject Object教案 新人教版必修4
- 2023六年级数学下册 五 奥运奖牌-扇形统计图 统计与可能性第2课时教案 青岛版六三制
- 八年级生物上册 20.4《性别和性别决定》教案 (新版)北师大版
- 2024-2025学年高中历史 第二单元 古代历史的变革(下)第7课 忽必烈改制教学教案 岳麓版选修1
- 汽车试验技术 课件 项目4 CAE虚拟试验技术
- 租用月嫂合同(2篇)
- Q-SY 08365-2021 气瓶使用安全管理规范
- 中国书法介绍英文版calligraphyintroduction
- 销售技巧之导购六式
- GB/T 41715-2022定向刨花板
- YC/T 384.3-2018烟草企业安全生产标准化规范第3部分:考核评价准则和方法
- 夏商周考古课件 第5章 西周文化(3节)
- GB/T 7324-2010通用锂基润滑脂
- GB/T 4459.1-1995机械制图螺纹及螺纹紧固件表示法
- 危险化学品安全告知牌硝酸、盐酸、硫酸、氢氧化钠
- 上海英文介绍课件
- 上交所个股期权基础知识课件
评论
0/150
提交评论