版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于JAVA的谈天室设计与实现设计目的:信息技术的高速进展给人类生产,生活带来了广泛而深远的影响。“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术"等新产品,新概念层出不穷,不断冲击着人们的视听。这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的进展。人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行讨论的科学。它主要讨论人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将连续对信息技术的进展产生巨大影响。谈天室是一项应用广泛,并且有用性强的一个格外典型的人机交互系统.在信息世界里,谈天工具的使用是格外频繁的,如MSN、QQ、校内通,之类的谈天工具很多人都正在使用。此次设计的谈天室系统虽然其功能简洁,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培育同学面对对象程序设计的思想,加深对面对对象程序设计四大特性的理解。二、需求分析人们日常生活中越来越多地使用谈天室这项应用来为自己的工作和学习服务。一个操作简洁,界面友好、运行稳定的谈天室对于小型局域网的用户可以起到很好的沟通作用。所谓谈天室就是一个可以让很多用户同时相互通信的网上园地,个人用户可以通过谈天室将自己融入整个主流社会中。依据目前使用谈天室的用户需求显示,用户对于谈天室主要有以下几点要求:(1)、谈天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看谈天记录,谈天过程中能对字体、表情等进行设定等。(2)、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。(3)、文件传输功能:用户可以共享资源,能发送及接收文件。(4)、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不行见的。(5)、系统稳定:客户端与服务端的连接稳定,不消灭或者少消灭连接不上的情况。该简易谈天室是为很多喜爱谈天的用户开发设计的,和很多大型的网络谈天室相比该小谈天室功能比较简洁,但能实现基本的谈天功能,点对多、点对点谈天和基本的用户功能,登录、注销、查看在线用户等。三、软件功能描述(1)、用户设置:功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)、登录功能:功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;(3)、公聊:功能描述:用户在谈天室中可以选择与“全部人”谈天,谈天室中的其他在线用户可以正常接收并正确显示公聊消息。(4)、私聊:功能描述:用户可以选择与谈天室的在线用户列表中的其他用户谈天。双方的谈天记录对于谈天室的其他用户是不行见的。(5)、谈天心情:功能描述:用户在谈天的过程中可以选择相应的心情来表达自己的情感.(6)、系统消息:功能描述:服务端正常运行的过程中,在谈天室的每一个用户都能接收服务器端发送的信息提示信息。(7)、用户的状态。功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。(8)、用户注销:功能描述:用户可以注销自己的账号,并重新登记登录名和地址。(9)、用户退出:功能描述:用户可以在正常情况下退出谈天室。(10)、服务端掌握:功能描述:只有在服务端开启的情况下,用户才能登陆成功和谈天;用户设置的地址端口也必须与服务端的侦听端口全都,否则不能登录.四:主要模块描述及流程图模块描述本谈天室分为谈天室服务端和谈天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接.在java中使用套接口相当简洁,JavaAPI为处理套接口的通信供应了一个类ja.Socket.,使得编写网络应用程序相对容易。服务器采纳多线程以满意多用户的恳求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接恳求,默认IP地址为:127。0.0.1默认端口为8888。(1)谈天室服务端模块图:聊天室服务端聊天室服务端发送系统消息退出服务器消息显示停止服务启动服务发送系统消息退出服务器消息显示停止服务启动服务端口服务端口服务:输入要侦听的端口,默认为8888;启动服务:启动服务器,并开头在设置的端口中侦听,客户端用户可以登录并开头谈天;停止服务:关闭服务器,侦听结束.客户端用户不能再谈天;发送系统消息:服务器端给全部人或者个别用户发送消息.消息显示:可以显示全部用户的谈天记录,和上线、下线信息。退出服务器:退出程序,并停止服务;(2)谈天室客户端模块图:聊天室客户端用户设置聊天室客户端用户设置用户注销用户注销发送/接收聊天消息退出用户登录发送/接收聊天消息退出用户登录连接设置用户设置:用户可以设置自己的用户名进行谈天;连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:127.0。0.1:8888;用户登录:只能在谈天室服务端已开启的情况下,用户才能登录,用户登录之后才能开头谈天,登录后不能再修改用户设置和连接设置;用户注销:退出谈天,可以连续修改用户设置和连接设置;发送和接收谈天信息:用户可以给全部人或者个别用户发送信息,并能看到其他用户发送给自己或全部人的消息;退出:关闭全部谈天并退出客户端。流程图聊天室服务器启动服务端口服务设置侦听端口聊天室服务器启动服务端口服务默认端口:8888聊天登录用户设置聊天室客户端聊天登录用户设置聊天室客户端设置用户名默认连接地址或用户名连接设置退出设置IP地址和端口连接设置退出五.主要类UML关系图:ActionListenerChatServer-port:publicstaticinActionListenerChatServer-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatServer():public+init():publicvoid+startService():publicvoid+stopService():publicvoid+sendStopToAll():publicvoid+sendMsgToAll(String):publicvoid+sendSystemMessage():publicvoidJFrameThreadServerListen-server:ServerSocket-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerListenServerListen-server:ServerSocket-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)1、谈天室服务器端设计:谈天室服务端主要包括7个文件,它们的功能如下:(1)ChatServer.java:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加大事侦听与大事处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。(2)ServerListen.java:该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。(3)ServerReceive.java:该类是实现服务器端的消息的收发的类.该类分别定义了向某用户及全部人发送消息的方法,发送的消息会显示在主界面类的界面上。(4)PortConf.java:该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类.(5)Node。java:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。(6)UserLinkList.java:用户链表节点的简略实现类.该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、依据用户名查找用户、依据索引查找用户这5个方法。(7)Help.java:服务端程序的帮助类。Thread谈天室客户端设计:ThreadActionListenerActionListenerChatClient-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatClient():public+init():publicvoid+Connect():publicvoid+DisConnect():publicvoid+SendMessage():publicvoidJFrameClientReceiveClientReceive-socket:Socket-output:ObjectOutputStream-input:ObjectInputStream+ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField)谈天室客户端主要包括5个文件,它们的功能如下:(1)ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加大事侦听与大事处理。该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接.当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者静静话.(2)ClientReceive.java:该类是实现服务器端与客户端消息收发的类。(3)ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。(4)UserConf.java:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。(5)Help。java:客户端程序的帮助类。六.主要程序代码清单和注释说明:******************ChatServer.java****************************************ﻩpublicvoidactionPerformed(ActionEvente){ﻩﻩObjectobj=e。getSource();ﻩﻩif(obj==startServer||obj==startItem){//启动服务端 ﻩﻩstartService();ﻩﻩ}ﻩ elseif(obj==stopServer||obj==stopItem){//停止服务端 ﻩ intj=JOptionPane.showConfirmDialog(ﻩﻩ ﻩthis,"真的停止服务吗?",”停止服务”,ﻩ ﻩﻩJOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);ﻩﻩﻩif(j==JOptionPane。YES_OPTION){ﻩ ﻩﻩstopService(); ﻩﻩ}ﻩﻩ}ﻩ elseif(obj==portSet||obj==portItem){//端口设置ﻩﻩﻩ//调出端口设置的对话框 ﻩ PortConfportConf=newPortConf(this);ﻩﻩﻩportConf.show();ﻩﻩ}ﻩﻩelseif(obj==exitButton||obj==exitItem){//退出程序ﻩﻩﻩintj=JOptionPane.showConfirmDialog(ﻩﻩﻩﻩthis,"真的要退出吗?","退出”,ﻩ ﻩJOptionPane。YES_OPTION,JOptionPane。QUESTION_MESSAGE);ﻩﻩ if(j==JOptionPane.YES_OPTION){ﻩﻩ ﻩstopService();ﻩﻩ ﻩSystem。exit(0);ﻩ ﻩ}ﻩﻩ}ﻩ elseif(obj==helpItem){//菜单栏中的帮助ﻩ ﻩ//调出帮助对话框ﻩ HelphelpDialog=newHelp(this);ﻩﻩ helpDialog。show();ﻩﻩ}ﻩﻩelseif(obj==sysMessage||obj==sysMessageButton){//发送系统消息ﻩﻩﻩsendSystemMessage(); ﻩ} }ﻩ/**ﻩ*启动服务端 */ publicvoidstartService(){ﻩﻩtry{ﻩ ﻩserverSocket=newServerSocket(port,10);ﻩﻩﻩmessageShow。append(”服务端已经启动,在"+port+"端口侦听...\n");ﻩﻩ startServer.setEnabled(false);ﻩﻩﻩstartItem。setEnabled(false);ﻩﻩﻩportSet。setEnabled(false);ﻩﻩﻩportItem。setEnabled(false);ﻩﻩﻩstopServer。setEnabled(true);ﻩﻩﻩstopItem.setEnabled(true);ﻩﻩ sysMessage。setEnabled(true);ﻩﻩ}ﻩﻩcatch(Exceptione){ﻩﻩﻩ//System.out。println(e);ﻩﻩ}ﻩ userLinkList=newUserLinkList();ﻩ listenThread=newServerListen(serverSocket,combobox,ﻩﻩ messageShow,showStatus,userLinkList);ﻩﻩlistenThread.start();ﻩ}ﻩ/** *关闭服务端ﻩ*/ publicvoidstopService(){ﻩﻩtry{ﻩﻩﻩ//向全部人发送服务器关闭的消息ﻩﻩ sendStopToAll();ﻩﻩﻩlistenThread.isStop=true;ﻩﻩﻩserverSocket.close();ﻩ ﻩintcount=userLinkList。getCount();ﻩ ﻩinti=0; ﻩﻩwhile(i〈count){ﻩﻩﻩﻩNodenode=userLinkList.findUser(i);ﻩﻩﻩ node.input.close();ﻩﻩ ﻩnode。output.close(); ﻩﻩﻩnode。socket.close(); ﻩﻩﻩi++;ﻩﻩﻩ}ﻩﻩﻩstopServer.setEnabled(false); ﻩﻩstopItem.setEnabled(false);ﻩﻩﻩstartServer.setEnabled(true); ﻩﻩstartItem。setEnabled(true);ﻩﻩﻩportSet.setEnabled(true);ﻩﻩﻩportItem.setEnabled(true);ﻩ ﻩsysMessage.setEnabled(false);ﻩﻩﻩmessageShow.append("服务端已经关闭\n");ﻩﻩﻩcombobox。removeAllItems(); ﻩ combobox。addItem("全部人"); ﻩ}ﻩ 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++;ﻩ } }ﻩ/**ﻩ*向全部人发送消息ﻩ*/ﻩpublicvoidsendMsgToAll(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++;ﻩﻩ} ﻩsysMessage。setText("”);ﻩ} /**ﻩ*向客户端用户发送消息ﻩ*/ publicvoidsendSystemMessage(){ ﻩStringtoSomebody=combobox.getSelectedItem().toString();ﻩﻩStringmessage=sysMessage。getText()+"\n";ﻩﻩmessageShow.append(message);ﻩﻩ//向全部人发送消息ﻩ if(toSomebody.equalsIgnoreCase("全部人”)){ﻩﻩﻩsendMsgToAll(message);ﻩﻩ}ﻩ else{ﻩﻩﻩ//向某个用户发送消息ﻩﻩ Nodenode=userLinkList.findUser(toSomebody);ﻩﻩﻩtry{ﻩﻩﻩﻩnode。output.writeObject("系统信息");ﻩ ﻩﻩnode.output.flush();ﻩﻩﻩﻩnode.output.writeObject(message);ﻩ ﻩﻩnode.output。flush();ﻩﻩﻩ} ﻩﻩcatch(Exceptione){ﻩ ﻩ//System.out.println(”!!!"+e);ﻩﻩﻩ}ﻩﻩ sysMessage。setText("”);//将发送消息栏的消息清空ﻩ }ﻩ}ﻩpublicstaticvoidmain(String[]args){ﻩ ChatServerapp=newChatServer();ﻩ}}************************ServerListen.java:***************************publicclassServerListenextendsThread{ﻩServerSocketserver;ﻩﻩJComboBoxcombobox;ﻩJTextAreatextarea;ﻩJTextFieldtextfield;ﻩUserLinkListuserLinkList;//用户链表ﻩNodeclient; ServerReceiverecvThread;ﻩﻩpublicbooleanisStop;ﻩ/*ﻩ*谈天服务端的用户上线于下线侦听类ﻩ*/ﻩpublicServerListen(ServerSocketserver,JComboBoxcombobox,ﻩﻩJTextAreatextarea,JTextFieldtextfield,UserLinkListuserLinkList){ﻩﻩthis.server=server; bobox=combobox; ﻩthis.textarea=textarea;ﻩﻩthis。textfield=textfield;ﻩﻩthis.userLinkList=userLinkList; ﻩﻩisStop=false;ﻩ}ﻩpublicvoidrun(){ﻩﻩwhile(!isStop&&!server。isClosed()){ ﻩﻩtry{ﻩﻩﻩﻩclient=newNode();ﻩﻩﻩﻩclient.socket=server.accept(); ﻩ client。output=newObjectOutputStream(client.socket。getOutputStream()); ﻩﻩﻩclient。output。flush();ﻩﻩﻩﻩclient。input=newObjectInputStream(client.socket。getInputStream());ﻩﻩﻩﻩclient.username=(String)client。input.readObject();ﻩﻩﻩﻩﻩ ﻩﻩ//显示提示信息ﻩﻩﻩﻩcombobox.addItem(client.username);ﻩ ﻩﻩuserLinkList.addUser(client);ﻩﻩﻩﻩtextarea。append("用户"+client。username+"上线"+”\n"); ﻩﻩﻩtextfield.setText(”在线用户”+userLinkList.getCount()+"人\n”);ﻩﻩﻩ ﻩﻩ recvThread=newServerReceive(textarea,textfield,ﻩ ﻩﻩﻩcombobox,client,userLinkList);ﻩﻩ ﻩrecvThread。start(); ﻩﻩ} ﻩ catch(Exceptione){ﻩﻩ }ﻩﻩ} }}********************************ServerReceive.java***********************/**服务器收发消息的类*/publicclassServerReceiveextendsThread{ JTextAreatextarea;ﻩJTextFieldtextfield;ﻩJComboBoxcombobox; Nodeclient;ﻩUserLinkListuserLinkList;//用户链表ﻩpublicbooleanisStop;ﻩﻩpublicServerReceive(JTextAreatextarea,JTextFieldtextfield, ﻩJComboBobobox,Nodeclient,UserLinkListuserLinkList){ﻩﻩthis.textarea=textarea;ﻩ this。textfield=textfield; ﻩthis。client=client;ﻩﻩthis.userLinkList=userLinkList; bobox=combobox;ﻩ ﻩﻩisStop=false;ﻩ}ﻩpublicvoidrun(){ﻩﻩ//向全部人发送用户的列表ﻩ sendUserList();ﻩﻩﻩ while(!isStop&&!client.socket。isClosed()){ﻩ ﻩtry{ﻩﻩ ﻩStringtype=(String)client。input.readObject(); ﻩﻩﻩif(type.equalsIgnoreCase("谈天信息")){ﻩﻩ ﻩﻩStringtoSomebody=(String)client.input。readObject();ﻩﻩﻩ Stringstatus=(String)client.input.readObject();ﻩﻩﻩﻩﻩStringaction=(String)client.input。readObject();ﻩﻩﻩﻩﻩStringmessage=(String)client。input.readObject();ﻩﻩ ﻩﻩ ﻩ ﻩStringmsg=client.usernameﻩﻩﻩ ﻩ ﻩ+""+actionﻩﻩﻩﻩﻩ +"对"ﻩﻩﻩﻩﻩﻩﻩ+toSomebody ﻩﻩﻩ ﻩ+"说:" ﻩﻩ ﻩ +message ﻩﻩ ﻩﻩ +”\n"; ﻩ ﻩif(status。equalsIgnoreCase(”静静话")){ﻩﻩ ﻩﻩ msg="[静静话]”+msg;ﻩﻩﻩﻩﻩ}ﻩﻩﻩﻩﻩtextarea.append(msg); ﻩﻩﻩ ﻩﻩif(toSomebody.equalsIgnoreCase("全部人")){ﻩﻩﻩﻩﻩﻩ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.equalsIgnoreCase("用户下线")){ﻩﻩﻩﻩﻩNodenode=userLinkList.findUser(client.username); ﻩ ﻩﻩuserLinkList.delUser(node);ﻩﻩﻩﻩﻩﻩﻩﻩﻩﻩStringmsg="用户"+client.username+”下线\n"; ﻩintcount=userLinkList。getCount();ﻩﻩﻩﻩﻩcombobox.removeAllItems();ﻩﻩﻩﻩﻩcombobox.addItem("全部人");ﻩﻩﻩﻩﻩinti=0;ﻩﻩﻩﻩﻩwhile(i〈count){ ﻩﻩﻩﻩ node=userLinkList.findUser(i);ﻩﻩ ﻩﻩﻩif(node==null){ﻩﻩ ﻩﻩi++;ﻩ ﻩﻩﻩ ﻩcontinue;ﻩﻩﻩﻩﻩ }ﻩﻩﻩﻩﻩﻩcombobox.addItem(node.username);ﻩﻩ ﻩﻩﻩi++;ﻩ ﻩﻩﻩ}ﻩﻩﻩ ﻩcombobox.setSelectedIndex(0);ﻩﻩﻩﻩﻩtextarea。append(msg); ﻩﻩﻩtextfield。setText(”在线用户"+userLinkList。getCount()+"人\n”);ﻩﻩﻩﻩﻩsendToAll(msg);//向全部人发送消息ﻩﻩﻩﻩﻩsendUserList();//重新发送用户列表,刷新ﻩﻩﻩﻩ ﻩ ﻩﻩﻩbreak;ﻩﻩ }ﻩﻩﻩ}ﻩﻩ catch(Exceptione){ﻩ ﻩﻩ//System。out。println(e);ﻩﻩ }ﻩ }ﻩ} /* *向全部人发送消息ﻩ*/ﻩ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++;ﻩ } }ﻩ/*ﻩ*向全部人发送用户的列表ﻩ*/ﻩ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++; }ﻩ}}*************************PortConf.java***********************************/***生成端口设置对话框的类*/publicclassPortConfextendsJDialog{ﻩJPanelpanelPort=newJPanel();ﻩJButtonsave=newJButton();ﻩJButtoncancel=newJButton(); publicstaticJLabelDLGINFO=newJLabel(ﻩﻩ”默认端口号为:8888"); JPanelpanelSave=newJPanel();ﻩJLabelmessage=newJLabel();ﻩpublicstaticJTextFieldportNumber;ﻩpublicPortConf(JFrameframe){ ﻩsuper(frame,true);ﻩﻩtry{ﻩ ﻩjbInit();ﻩ }ﻩﻩcatch(Exceptione){ ﻩﻩe.printStackTrace(); ﻩ} //设置运行位置,使对话框居中 DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();ﻩﻩthis.setLocation((int)(screenSize.width—400)/2+50,ﻩﻩﻩﻩ ﻩ(int)(screenSize.height-600)/2+150); this。setResizable(false);ﻩ}ﻩprivatevoidjbInit()throwsException{ﻩﻩthis。setSize(newDimension(300,120));ﻩﻩthis.setTitle("端口设置");ﻩ message。setText("请输入侦听的端口号:");ﻩﻩportNumber=newJTextField(10);ﻩ portNumber.setText(””+ChatServer.port);ﻩﻩsave.setText("保存");ﻩﻩcancel.setText("取消");ﻩﻩpanelPort。setLayout(newFlowLayout());ﻩﻩpanelPort。add(message);ﻩ panelPort.add(portNumber);ﻩ panelSave。add(newLabel(””));ﻩﻩpanelSave。add(save); panelSave.add(cancel);ﻩﻩpanelSave.add(newLabel(""));ﻩﻩContainercontentPane=getContentPane();ﻩﻩcontentPane.setLayout(newBorderLayout()); ﻩcontentPane.add(panelPort,BorderLayout。NORTH);ﻩ contentPane.add(DLGINFO,BorderLayout.CENTER); contentPane.add(panelSave,BorderLayout.SOUTH); ﻩ//保存按钮的大事处理ﻩ save.addActionListener( ﻩﻩnewActionListener(){ﻩﻩﻩﻩpublicvoidactionPerformed(ActionEventa){ﻩ ﻩ ﻩintsavePort;ﻩﻩﻩ ﻩtry{ﻩ ﻩﻩﻩ ﻩﻩ ﻩ ﻩsavePort=Integer.parseInt(PortConf.portNumber.getText());ﻩ ﻩﻩﻩﻩif(savePort<1||savePort〉65535){ﻩﻩﻩﻩﻩﻩﻩPortConf.DLGINFO.setText("侦听端口必须是0-65535之间的整数!");ﻩﻩﻩﻩﻩﻩﻩPortConf.portNumber。setText("”);ﻩﻩﻩﻩ ﻩreturn;ﻩﻩﻩ ﻩﻩ}ﻩﻩﻩ ﻩ ChatServer.port=savePort; ﻩﻩ dispose(); ﻩﻩﻩﻩ}ﻩﻩﻩ ﻩcatch(NumberFormatExceptione){ ﻩ ﻩﻩﻩPortConf。DLGINFO.setText("错误的端口号,端口号请填写整数!");ﻩﻩﻩﻩﻩﻩPortConf.portNumber.setText("");ﻩ ﻩﻩﻩreturn;ﻩﻩ ﻩﻩ}ﻩ }ﻩﻩﻩ} );ﻩﻩ//关闭对话框时的操作 ﻩthis.addWindowListener(ﻩﻩﻩnewWindowAdapter(){ﻩ ﻩﻩpublicvoidwindowClosing(WindowEvente){ﻩﻩ ﻩﻩDLGINFO。setText(”默认端口号为:8888"); ﻩﻩ}ﻩ }ﻩﻩ);ﻩ //取消按钮的大事处理ﻩﻩcancel。addActionListener(ﻩﻩﻩnewActionListener(){ﻩ ﻩﻩpublicvoidactionPerformed(ActionEvente){ﻩﻩﻩ ﻩDLGINFO。setText("默认端口号为:8888");ﻩﻩﻩﻩﻩdispose();ﻩﻩﻩ }ﻩﻩﻩ});ﻩ}}**********************Node.java*****************************************/***用户链表的结点类*/publicclassNode{ﻩStringusername=null;ﻩSocketsocket=null;ﻩObjectOutputStreamoutput=null;ﻩObjectInputStreaminput=null; Nodenext=null;}**************************UserLinkList.java*****************************/***用户链表*/publicclassUserLinkList{ﻩNoderoot;ﻩNodepointer;ﻩintcount;ﻩ/** *构造用户链表ﻩ*/ﻩpublicUserLinkList(){ ﻩroot=newNode();ﻩﻩroot.next=null;ﻩﻩpointer=null;ﻩﻩcount=0; }ﻩ/**ﻩ*添加用户ﻩ*/ﻩpublicvoidaddUser(Noden){ ﻩpointer=root;ﻩﻩ ﻩwhile(pointer.next!=null){ ﻩﻩpointer=pointer.next;ﻩﻩ}ﻩﻩpointer.next=n;ﻩ n.next=null; ﻩcount++;ﻩ ﻩ} /**ﻩ*删除用户 */ publicvoiddelUser(Noden){ﻩ pointer=root;ﻩ 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=root; while(pointer。next!=null){ ﻩ pointer=pointer.next;ﻩﻩﻩif(pointer.username.equalsIgnoreCase(username)){ﻩ ﻩﻩreturnpointer; ﻩﻩ} ﻩ}ﻩﻩreturnnull; }ﻩ/**ﻩ*依据索引查找用户ﻩ*/ﻩpublicNodefindUser(intindex){ﻩﻩif(count==0){ﻩ ﻩreturnnull;ﻩ }ﻩ if(index〈0){ ﻩreturnnull; ﻩ}ﻩﻩpointer=root;ﻩﻩinti=0; ﻩwhile(i<index+1){ﻩﻩ if(pointer。next!=null){ﻩ ﻩﻩpointer=pointer.next;ﻩ } ﻩ else{ ﻩﻩreturnnull; }ﻩﻩﻩi++; ﻩ}ﻩ returnpointer;ﻩ}}**************************Help。java*************************************/***生成设置对话框的类*/publicclassHelpextendsJDialog{ JPaneltitlePanel=newJPanel();ﻩJPanelcontentPanel=newJPanel(); JPanelclosePanel=newJPanel();ﻩJButtonclose=newJButton(); JLabeltitle=newJLabel(”谈天室服务端帮助");ﻩJTextAreahelp=newJTextArea();ﻩColorbg=newColor(255,255,255);ﻩpublicHelp(JFrameframe){ﻩﻩsuper(frame,true);ﻩﻩtry{ ﻩﻩjbInit();ﻩﻩ}ﻩﻩcatch(Exceptione){ ﻩﻩe.printStackTrace(); }ﻩ //设置运行位置,使对话框居中ﻩﻩDimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();ﻩ this.setLocation((int)(screenSize.width-400)/2,ﻩ ﻩﻩ ﻩ(int)(screenSize.height-320)/2);ﻩ this。setResizable(false);ﻩ}ﻩprivatevoidjbInit()throwsException{ﻩ this。setSize(newDimension(400,200)); ﻩthis.setTitle("帮助"); titlePanel.setBackground(bg);;ﻩﻩcontentPanel.setBackground(bg);ﻩﻩclosePanel.setBackground(bg); ﻩhelp.setText(”1、设置服务端的侦听端口(默认端口为8888)。\n"+ ﻩ”2、点击启动服务按钮便可在指定的端口启动服务.\n"+ﻩ ﻩ”3、选择需要接受消息的用户,在消息栏中写入消息,之后便可发送消息。\n"+ﻩﻩﻩ"4、信息状态栏中显示服务器当前的启动与停止状态、"+ ﻩﻩ”用户发送的消息和\n服务器端发送的系统消息。");ﻩ help.setEditable(false);ﻩﻩtitlePanel.add(newLabel(""));ﻩﻩtitlePanel.add(title);ﻩﻩtitlePanel.add(newLabel("”)); ﻩcontentPanel.add(help);ﻩ closePanel.add(newLabel(""));ﻩﻩclosePanel。add(close);ﻩﻩclosePanel。add(newLabel("”));ﻩﻩContainercontentPane=getContentPane();ﻩ contentPane.setLayout(newBorderLayout());ﻩ contentPane。add(titlePanel,BorderLayout.NORTH);ﻩﻩcontentPane.add(contentPanel,BorderLayout.CENTER);ﻩ contentPane.add(closePanel,BorderLayout.SOUTH);ﻩﻩclose.setText("关闭");ﻩ //大事处理ﻩﻩclose.addActionListener(ﻩﻩﻩnewActionListener(){ﻩﻩﻩﻩpublicvoidactionPerformed(ActionEvente){ﻩﻩ ﻩﻩdispose();ﻩﻩ ﻩ}ﻩﻩﻩ}); }}谈天室客户端设计:****************************ChatClient.java******************************/**谈天客户端的主框架类*/publicclassChatClientextendsJFrameimplementsActionListener{ﻩ/**ﻩ*ﻩ*/ﻩprivatestaticfinallongserialVersionUID=1L;ﻩStringip="127.0。0.1”;//连接到服务端的ip地址 intport=8888;//连接到服务端的端口号ﻩStringuserName="狂狂";//用户名ﻩinttype=0;//0表示未连接,1表示已连接ﻩJComboBoxcombobox;//选择发送消息的接受者ﻩJTextAreamessageShow;//客户端的信息显示ﻩJScrollPanemessageScrollPane;//信息显示的滚动条ﻩJLabelexpress,sendToLabel,messageLabel;ﻩJTextFieldclientMessage;//客户端消息的发送ﻩJCheckBoxcheckbox;//静静话ﻩJComboBoxactionlist;//表情选择 JButtonclientMessageButton;//发送消息ﻩJTextFieldshowStatus;//显示用户连接状态ﻩSocketsocket; ObjectOutputStreamoutput;//网络套接字输出流ﻩObjectInputStreaminput;//网络套接字输入流 ClientReceiverecvThread;ﻩ//建立菜单栏 JMenuBarjMenuBar=newJMenuBar(); //建立菜单组 JMenuoperateMenu=newJMenu("操作(O)");ﻩ//建立菜单项 JMenuItemloginItem=newJMenuItem("用户登录(I)",newImageIcon("face/98.gif”)); JMenuItemlogoffItem=newJMenuItem("用户注销(L)",newImageIcon("face/icon.gif”));ﻩJMenuItemexitItem=newJMenuItem("退出(X)”,newImageIcon("face/smile.gif"));ﻩJMenuconMenu=newJMenu("设置(C)");ﻩJMenuItemuserItem=newJMenuItem(”用户设置(U)”,newImageIcon("face/messenger_big.gif”));ﻩJMenuItemconnectItem=newJMenuItem(”连接设置(C)",newImageIcon(”face/Uabrand。gif”));ﻩJMenuhelpMenu=newJMenu(”帮助(H)”); JMenuItemhelpItem=newJMenuItem(”帮助(H)”,newImageIcon("face/HelpCenter.gif"));ﻩ//建立工具栏 JToolBartoolBar=newJToolBar();ﻩ//建立工具栏中的按钮组件ﻩJButtonloginButton;//用户登录ﻩJButtonlogoffButton;//用户注销 JButtonuserButton;//用户信息的设置 JButtonconnectButton;//连接设置ﻩJButtonexitButton;//退出按钮ﻩ//框架的大小ﻩDimensionfaceSize=newDimension(400,600);ﻩJPaneldownPanel;ﻩGridBagLayoutgirdBag; GridBagConstraintsgirdBagCon;ﻩpublicChatClient(){ﻩﻩinit();//初始化程序ﻩﻩ//添加框架的关闭大事处理ﻩ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ﻩﻩthis。pack(); ﻩ//设置框架的大小ﻩﻩthis.setSize(faceSize);ﻩﻩthis.setVisible(true); ﻩsetIconImage(getToolkit().getImage(”face/love.gif"));ﻩﻩ//设置运行时窗口的位置ﻩ DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); ﻩthis。setLocation((int)(screenSize。width-faceSize.getWidth())/2,ﻩ ﻩ ﻩ(int)(screenSize.height—faceSize。getHeight())/2); ﻩthis.setResizable(false);ﻩﻩthis.setTitle("谈天室客户端");//设置标题ﻩﻩ//为操作菜单栏设置热键’V'ﻩﻩoperateMenu.setMnemonic(’O’);ﻩﻩ//为用户登录设置快捷键为ctrl+iﻩﻩloginItem.setMnemonic(’I’); ﻩloginItem.setAccelerator(KeyStroke。getKeyStroke(KeyEvent。VK_I,InputEvent.CTRL_MASK));ﻩ //为用户注销快捷键为ctrl+l logoffItem.setMnemonic(’L');ﻩ logoffItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));ﻩﻩ//为退出快捷键为ctrl+x exitItem.setMnemonic(’X’);ﻩﻩexitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent。VK_X,InputEvent.CTRL_MASK));ﻩﻩ//为设置菜单栏设置热键’C'ﻩ conMenu.setMnemonic('C');ﻩ //为用户设置设置快捷键为ctrl+uﻩ userItem。setMnemonic(’U');ﻩﻩuserItem。setAccelerator(KeyStroke.getKeyStroke(KeyEvent。VK_U,InputEvent.CTRL_MASK)); ﻩ//为连接设置设置快捷键为ctrl+cﻩﻩconnectItem。setMnemonic('C');ﻩﻩconnectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK)); ﻩ//为帮助菜单栏设置热键'H’ﻩﻩhelpMenu.setMnemonic(’H’);ﻩﻩ//为帮助设置快捷键为ctrl+pﻩﻩhelpItem.setMnemonic(’H');ﻩﻩhelpItem。setAccelerator(KeyStroke。getKeyStroke(KeyEvent.VK_H,InputEvent。CTRL_MASK));ﻩ} /**ﻩ*程序初始化函数ﻩ*/ﻩpublicvoidinit(){ﻩ ContainercontentPane=getContentPane();ﻩ contentPane.setLayout(newBorderLayout()); ﻩ//添加菜单栏ﻩﻩoperateMenu.add(loginItem); ﻩoperateMenu。add(logoffItem);ﻩﻩoperateMenu.addSeparator();ﻩﻩoperateMenu.add(exitItem);ﻩ jMenuBar。add(operateMenu);ﻩﻩconMenu.add(userItem);ﻩﻩconMenu.addSeparator();ﻩﻩconMenu.add(connectItem);ﻩﻩjMenuBar.add(conMenu);ﻩ helpMenu.add(helpItem); ﻩjMenuBar。add(helpMenu);ﻩ setJMenuBar(jMenuBar);ﻩﻩ//初始化按钮ﻩﻩloginButton=newJButton("登录”);ﻩﻩlogoffButton=newJButton("注销");ﻩﻩuserButton=newJButton("用户设置"); connectButton=newJButton("连接设置”);ﻩ exitButton=newJButton(”退出");ﻩﻩ//当鼠标放上显示信息ﻩ loginButton.setToolTipText(”连接到指定的服务器"); ﻩlogoffButton。setToolTipText("与服务器断开连接"); userButton.setToolTipText(”设置用户信息”);ﻩ connectButton。setToolTipText("设置所要连接到的服务器信息"); ﻩ//将按钮添加到工具栏ﻩ toolBar.add(userButton); ﻩtoolBar。add(connectButton);ﻩﻩtoolBar.addSeparator();//添加分隔栏 toolBar。add(loginButton);ﻩﻩtoolBar.add(logoffButton); ﻩtoolBar.addSeparator();//添加分隔栏ﻩﻩtoolBar。add(exitButton);ﻩﻩcontentPane.add(toolBar,BorderLayout。NORTH); ﻩcheckbox=newJCheckBox("静静话");ﻩﻩcheckbox。setSelected(false); actionlist=newJComboBox(); ﻩactionlist.addItem(”微笑地");ﻩ actionlist.addItem(”高兴地”);ﻩﻩactionlist.addItem(”轻轻地");ﻩﻩactionlist。addItem(”生气地"); ﻩactionlist。setSelectedIndex(0); ﻩ//初始时ﻩﻩloginButton.setEnabled(true);ﻩﻩlogoffButton。setEnabled(false);ﻩ //为菜单栏添加大事监听 ﻩloginItem.addActionListener(this);ﻩﻩlogoffItem.addActionListener(this);ﻩﻩexitItem。addActionListener(this);ﻩﻩuserItem。addActionListener(this);ﻩﻩconnectItem.addActionListener(this);ﻩﻩhelpItem.addActionListener(this);ﻩﻩ//添加按钮的大事侦听ﻩﻩloginButton.addActionListener(this);ﻩﻩlogoffButton.addActionListener(this); userButton。addActionListener(this); ﻩconnectButton.addActionListener(this);ﻩﻩexitButton.addActionListener(this);ﻩﻩcombobox=newJComboBox();ﻩ combobox.insertItemAt("全部人",0);ﻩﻩcombobox。setSelectedIndex(0); ﻩmessageShow=newJTextArea();ﻩ messageShow.setEditable(false);ﻩ //添加滚动条ﻩﻩmessageScrollPane=newJScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, ﻩﻩJScrollPane。HORIZONTAL_SCROLLBAR_AS_NEEDED);ﻩﻩmessageScrollPane.setPreferredSize(newDimension(400,400)); messageScrollPane.revalidate();ﻩﻩclientMessage=newJTextField(23);ﻩﻩclientMessage.setEnabled(false); ﻩclientMessageButton=newJButton();ﻩ clientMessageButton.setText("发送”);ﻩﻩ//添加系统消息的大事侦听 ﻩclientMessage.addActionListener(this);ﻩﻩclientMessageButton.addActionListener(this);ﻩﻩsendToLabel=newJLabel("发送至:");ﻩ express=newJLabel("表情:");ﻩﻩmessageLabel=newJLabel("发送消息:”); ﻩdownPanel=newJPanel(); ﻩgirdBag=newGridBagLayout(); ﻩdownPanel。setLayout(girdBag);ﻩﻩgirdBagCon=newGridBagConstraints(); ﻩgirdBagCon.gridx=0; ﻩgirdBagCon.gridy=0;ﻩ girdBagCon.gridwidth=5;ﻩﻩgirdBagCon.gridheight=2;ﻩﻩgirdBagCon.ipadx=5;ﻩﻩgirdBagCon。ipady=5;ﻩﻩJLabelnone=newJLabel("”);ﻩﻩgirdBag.setConstraints(none,girdBagCon);ﻩﻩdownPanel.add(none);ﻩﻩgirdBagCon=newGridBagConstraints(); ﻩgirdBagCon.gridx=0;ﻩ girdBagCon。gridy=2;ﻩﻩgirdBagCon.insets=newInsets(1,0,0,0);ﻩ //girdBagCon。ipadx=5;ﻩﻩ//girdBagCon。ipady=5; ﻩgirdBag。setConstraints(sendToLabel,girdBagCon);ﻩﻩdownPanel。add(sendToLabel);ﻩ girdBagCon=newGridBagConstraints();ﻩ girdBagCon.gridx=1;ﻩﻩgirdBagCon.gridy=2;ﻩﻩgirdBagCon。anchor=GridBagConstraints.LINE_START;ﻩ girdBag.setConstraints(combobox,girdBagCon); downPanel.add(combobox);ﻩﻩgirdBagCon=newGridBagConstraints();ﻩﻩgirdBagCon.gridx=2; girdBagCon.gridy=2;ﻩ girdBagCon.anchor=GridBagConstraints.LINE_END;ﻩﻩgirdBag.setConstraints(express,girdBagCon);ﻩﻩdownPanel.add(express);ﻩﻩgirdBagCon=newGridBagConstraints(); ﻩgirdBagCon.gridx=3;ﻩﻩgirdBagCon。gridy=2;ﻩﻩgirdBagCon.anchor=GridBagConstraints。LINE_START;ﻩ //girdBagCon.insets=newInsets(1,0,0,0);ﻩ //girdBagCon.ipadx=5;ﻩﻩ//girdBagCon.ipady=5;ﻩﻩgirdBag.setConstraints(actionlist,girdBagCon);ﻩﻩdownPanel.add(actionlist);ﻩ girdBagCon=newGridBagConstraints();ﻩﻩgirdBagCon。gridx=4;ﻩ girdBagCon。gridy=2;ﻩﻩgirdBagCon.insets=newInsets(1,0,0,0);ﻩﻩ//girdBagCon。ipadx=5;ﻩ //girdBagCon.ipady=5; ﻩgirdBag。setConstraints(checkbox,girdBagCon);ﻩﻩdownPanel.add(checkbox); ﻩgirdBagCon=newGridBagConstraints(); ﻩgirdBagCon.gridx=0;ﻩﻩgirdBagCon.gridy=3;ﻩ girdBag.setConstraints(messageLabel,girdBagCon); ﻩdownPanel。add(messageLabel);ﻩﻩgirdBagCon=newGridBagConstraints(); ﻩgirdBagCon.gridx=1;ﻩ girdBagCon。gridy=3;ﻩﻩgirdBagCon.gridwidth=3;ﻩﻩgirdBagCon.gridheight=1;ﻩﻩgirdBag.setConstraints(clientMessage,girdBagCon);ﻩﻩdownPanel.add(clientMessage); ﻩgi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《焊接工程综合实验》实验教学大纲
- 玉溪师范学院《体育科学研究方法》2022-2023学年第一学期期末试卷
- 数学15的认识教学课件教学课件教学
- 拆除工程施工方案
- 2024年电子控制自动变速箱项目评估分析报告
- 2024年网络接口适配器项目成效分析报告
- 2024年碱锰电池项目成效分析报告
- 采购产品特定模具费用先期垫付协议书
- 不带机械操作手的机械租赁合同
- 必胜客离职合同
- 2024年消防月全员消防安全知识专题培训-附20起典型火灾案例
- 度无锡市高技能人才培养基地工作自评报告
- 标准坐标纸(共3页)
- 高三生物二轮复习 专题二、细胞的代谢教学案
- 初中音乐-变声期的嗓音保护-课件PPT课件
- 50立方油罐容积表
- 管片生产管理办法(最终)
- 矿产资源勘查实施方案审查要求
- 学科带头人推荐报告
- 国家电网公司电力客户档案管理规定
- 单相接地电容电流的计算分析1
评论
0/150
提交评论