版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专业课程设计I基于JAVA的聊天室设计与实现一、课题内容和要求基于网络的文本交互软件的设计和实现,设计和实现一个简单的基于网络的文本消息发送和接收软件。基本要求:该软件能实现文本消息发送和接收功能。提高要求(1):支持以多播方式发送文本消息,提高要求(2):性能稳定,界面友好。按课程设计报告的要求写出详细的设计和实现报告。二、设计思路分析聊天室是一项进行文本交互的软件,应用广泛,并且实用性强的一个非常典型的人机交互系统。在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通之类的聊天工具许多人都正在使用。此次设计的聊天室系统主要针对文本信息的传送和接收,不能像QQ一样进行图片、音频、视频等文件的传输。虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养了面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。文件传输功能:用户可以共享资源,能发送及接收文件。保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。1、聊天室的简要功能介绍该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、注销、查看在线用户等。(1)用户设置:功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)登录功能:功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;⑶公聊:功能描述:用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。私聊:功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。双方的聊天记录对于聊天室的其他用户是不可见的。聊天心情:功能描述:用户在聊天的过程中可以选择相应的心情来表达自己的情感。系统消息:功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。用户的状态.功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。用户注销:功能描述:用户可以注销自己的账号,并重新登记登录名和地址。用户退出:功能描述:用户可以在正常情况下退出聊天室。服务端控制:功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。2、模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:默认端口为8888。(1)聊天室服务端模块图:端口服务:输入要侦听的端口,默认为8888;启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;停止服务:关闭服务器,侦听结束。客户端用户不能再聊天;发送系统消息:服务器端给所有人或者个别用户发送消息。消息显示:可以显示所有用户的聊天记录,和上线、下线信息。退出服务器:退出程序,并停止服务;连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为::8888;用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;用户注销:退出聊天,可以继续修改用户设置和连接设置;发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;退出:关闭所有聊天并退出客户端。(3)流程图四、详细设计1、聊天室服务器端设计:ThreadAJFrameActionListener四、详细设计1、聊天室服务器端设计:ThreadAJFrameActionListener—ZKZxChatServer-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatServer():public+init():publicvoid+startService():publicChatServer-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatServer():public+init():publicvoid+startService():publicvoid+stopService():publicvoid+sendStopToAll():publicvoid+sendMsgToAll(String):publicvoid+sendSystemMessage():publicvoid.SevJrLfetinlServerSocketJComboBoxJTextAreagtFieedvu醐nkList)-userLinkList:UserLinkListServ眼eeuXicBoolean_「_+exrveLJTextServLerSocket,JComboBox,JTextAreaJTe嘛瞄醐硼跖-isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)聊天室服务端主要包括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:服务端程序的帮助类。2、聊天室客户端设计:聊天室客户端主要包括5个文件,它们的功能如下:ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。ClientReceive.java:该类是实现服务器端与客户端消息收发的类。ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。UserConf.java:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。Help.java:客户端程序的帮助类。五、测试数据及其结果分析1、首先运行ChatServer工程文件,会出现如下画面2、选择端口设置,可以设置您要侦听的端口号,不设置将默认端口号为8888;3、选择启动服务,服务器开始在您刚才设置的端口中侦听;4、运行ChatClient工程文件,打开如下画面盘作I削设置0IffWitd)?用尸诅击|谨按肇团」丑录,阳§1I帆出i¥W^¥1QZ1.F22就E朋应口悄悄话此至:|4有人|"|表陪:I#矣的匕发送泊口悄悄话TT浊r=1,、5、选择用户设置可以设置自己的登录名6、选择连接设置可以设置您的IP地址和端口号7、选择登录进入聊天室并可以开始跟所有人或者个别其他用户聊天,其中可以选择心情等;回区1雄作(Q)避置©HMtm::;旧户瞄I攻抬画型录I陇销I网I详学屹世咨10^1.2.223:989L-云均.gg镣笑地对所有无说工玄好食遥至:所有Ag柬暗:噂囹t口情情甘发说2息||蜒或我用n1,,8、在服务端也可以选择给所有人或者个别用户发送消息;版鸯帮助秦和谖直匝服劣悖止服缶||jga|牌务端巳绶启动,在勰sffl口便听....用户归狂上关)=尸em丁夙^.-■'dc-蚓gg诫美地对防有人说:林好饰好签g:mf专说巾耳|[最送W法.用「1“注意:客户端只有在服务端开启的情况下才能正常聊天。9、多人聊天的服务器端与客户端情况0■美室客户语-q区]操作圈帮聊]蹇录|倒肯||起出|匡接服务器制卫也23金£前成功...醐瘩扁掉FfW英宜或HUlMiUA.涅白】E狂祖定地屯所有人有:伽f如成至HiP蜀福J.好血门仔啊业三的蜀右).涅il^Tbra粉甄对都T乂说没吃,憾…。品航信息今天中午啊什吃啊?bra粉甄对都T乂说空气。…as当公佥.新M.•舟会堂而许葱」陌I*7;皿一亍.LkH节言,'舟不担专ESI使主此的司至网:容冠gc三司也由3iW.J、涅J明淀n向、,七生咽生气电的所有人说面苛用强gc兰气地可柘!、说TS,二I院冬ki=狂传壬地.甘所有人说:是口:gc二气地.寸由土.<况无上说W讶.一其宜就电廿折生.人淀-_-St送至:祈点A表尚—匚悄悄诂拜肖ja「在娜户r代码如下:packageliaotian;/***用户链表*/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;}}packageliaotian;importjava.awt.*;importjava.awt.event.*;importjava.io.*;.*;importjavax.swing.*;/**聊天客户端的主框架类*/publicclassChatClientextendsJFrameimplementsActionListener{/****/privatestaticfinallongserialVersionUID=1L;Stringip="”;//连接到服务端的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("ImageIcon("face/Uabrand.gif"));连接设置(C)",newJMenuhelpMenu=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+iloginItem.setMnemonic('I');loginItem.setAccelerator(KeyEvent.VK_I,InputEvent.CTRL_MASK));//为用户注销快捷键为ctrl+llogoffItem.setMnemonic('L');logoffItem.setAccelerator(KeyEvent.VK_L,InputEvent.CTRL_MASK));//为退出快捷键为ctrl+xexitItem.setMnemonic('X');exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));〃为设置菜单栏设置热键'C'
conMenu.setMnemonic('C');〃为操作菜单栏设置热键'V'operateMenu.setMnemonic('O');〃为用户登录设置快捷键为ctrl+iloginItem.setMnemonic('I');loginItem.setAccelerator(KeyEvent.VK_I,InputEvent.CTRL_MASK));//为用户注销快捷键为ctrl+llogoffItem.setMnemonic('L');logoffItem.setAccelerator(KeyEvent.VK_L,InputEvent.CTRL_MASK));//为退出快捷键为ctrl+xexitItem.setMnemonic('X');exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));〃为设置菜单栏设置热键'C'
conMenu.setMnemonic('C');〃为用户设置设置快捷键为ctrl+uuserItem.setMnemonic('U');userItem.setAccelerator(KeyEvent.VK_U,InputEvent.CTRL_MASK));(KeyStroke.getKeyStroke(KeyStroke.getKeyStroke(KeyStroke.getKeyStroke(KeyStroke.getKeyStroke}/***程序初始化函数*/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);girdBagCon=newGridBagConstraints();girdBagCon.gridx=4;girdBagCon.gridy=3;girdBag.setConstraints(clientMessageButton,girdBagCon);downPanel.add(clientMessageButton);showStatus=newJTextField(35);showStatus.setEditable(false);girdBagCon=newGridBagConstraints();girdBagCon.gridx=0;girdBagCon.gridy=5;girdBagCon.gridwidth=5;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);〃关闭程序时的操作this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){if(type==1){DisConnect();}System.exit(0);}});}/***事件处理*/publicvoidactionPerformed(ActionEvente){Objectobj=e.getSource();if(obj==userItem||obj==userButton){//用户信息设置〃调出用户信息设置对话框UserConfuserConf=newUserConf(this,userName);userConf.setVisible(true);userName=userConf.userInputName;}elseif(obj==connectitem||obj==connectButton){//连接服务端设置//调出连接设置对话框ConnectConfconConf=newConnectConf(this,ip,port);conConf.setVisible(true);ip=conConf.userinputip;port=conConf.userinputPort;}elseif(obj==loginitem||obj==loginButton){//登录Connect();}elseif(obj==logoffitem||obj==logoffButton){//注销DisConnect();showStatus.setText("");}elseif(obj==clientMessage||obj==clientMessageButton){//发送消息SendMessage();clientMessage.setText("");}elseif(obj==exitButton||obj==exititem){//退出intj=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出〃,JOptionPane.YES_OPTiON,JOptionPane.QUESTiON_MESSAGE);if(j==JOptionPane.YES_OPTiON){if(type==1){DisConnect();}System.exit(O);}}elseif(obj==helpitem){//菜单栏中的帮助〃调出帮助对话框HelphelpDialog=newHelp(this);helpDialog.setVisible(true);}}publicvoidConnect(){try{socket=newSocket(ip,port);}catch(Exceptione){JOptionPane.showConfirmDialog(this,"不能连接到指定的服务器。\n请确认连接设置是否正确。〃,〃提示",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);return;}try{output=newObjectOutputStream(socket.getOutputStream());output.flush();input=newObjectInputStream(socket.getInputStream());output.writeObject(userName);output.flush();recvThread=newClientReceive(socket,output,input,combobox,messageShow,showStatus);recvThread.start();loginButton.setEnabled(false);loginItem.setEnabled(false);userButton.setEnabled(false);userItem.setEnabled(false);connectButton.setEnabled(false);connectItem.setEnabled(false);logoffButton.setEnabled(true);logoffItem.setEnabled(true);clientMessage.setEnabled(true);messageShow.append("连接服务器”+ip+":"+port+”成功...\n");type=1;//标志位设为已连接}catch(Exceptione){System.out.println(e);return;}}publicvoidDisConnect(){loginButton.setEnabled(true);loginItem.setEnabled(true);userButton.setEnabled(true);userItem.setEnabled(true);connectButton.setEnabled(true);connectItem.setEnabled(true);logoffButton.setEnabled(false);logoffItem.setEnabled(false);clientMessage.setEnabled(false);if(socket.isClosed()){return;}try{output.writeObject("用户下线");output.flush();input.close();output.close();socket.close();messageShow.append("已经与服务器断开连接...\n");type=0;//标志位设为未连接}catch(Exceptione){//}}publicvoidSendMessage(){StringtoSomebody=combobox.getSelectedItem().toString();Stringstatus="";if(checkbox.isSelected()){status="悄悄话";}Stringaction=actionlist.getSelectedItem().toString();Stringmessage=clientMessage.getText();if(socket.isClosed()){return;}try{output.writeObject("聊天信息");output.flush();output.writeObject(toSomebody);output.flush();output.writeObject(action);output.flush();output.writeObject(action);output.flush();output.writeObject(message);output.flush();catch(Exceptione){//}}publicstaticvoidmain(String[]args){newChatClient();}}packageliaotian;importjava.awt.*;importjava.awt.event.*;.*;importjavax.swing.*;publicclassChatServerextendsJFrameimplementsActionListener{publicstaticintport=8888;//-^tn^^Oiiy^E^UServerSocketserverSocket;//-^In^ESocketJComboBoxcombobox;JTextAreamessageShow;JTextFieldshowStatus;JScrollPanemessageScrollPane;JLabelsendToLabel,messageLabel;JTextFieldsysMessage;JButtonsysMessageButton;UserLinkListuserLinkList;JMenuBarjMenuBar=newJMenuBar();JMenuserviceMenu=newJMenu(H-^tnH);JMenultemportitem=newJMenuItem(H^E^UEeOAH);JMenultemstartitem=newJMenuItem(n^6^—-^tnn);JMenultemstopitem=newJMenuItem(HI£d1-^tnn);JMenultemexititem=newJMenuItem("IE3o");JMenuhelpMenu=newJMenu(H°iduH);JMenultemhelpitem=newJMenuItem(H°iduH);JToolBartoolBar=newJToolBar();JButtonportSet;JButtonstartServer;JButtonstopServer;JButtonexitButton;//id^UzoDjDimensionfaceSize=newDimension(400,600);ServerListenlistenThread;JPaneldownPanel;GridBagLayoutgirdBag;GridBagConstraintsgirdBagCon;/***•^tn^E116io-Ey*/publicChatServer(){init();//36E^»—3IDdthis.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();this.setSize(faceSize);this.setVisible(true);//EedA6EDDE±zOiUt»dADimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,(int)(screenSize.height-faceSize.getHeight())/2);this.setResizable(false);this.setTitle(HAAiiEd-^in^EH);}publicvoidinit(){ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayout());serviceMenu.add(portltem);serviceMenu.add(startltem);serviceMenu.addSeparator();serviceMenu.add(stopItem);serviceMenu.addSeparator();serviceMenu.add(exitltem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//36E蛔》一°』¥portSet=newJButton(H^E^UEeOAH);startServer=newJButton(H^6^—-^tnn);stopServer=newJButton(nI£Oi-^inn);exitButton=newJButton("IE36n);toolBar.add(portSet);toolBar.addSeparator();toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);stopServer.setEnabled(false);stopItem.setEnabled(false);startItem.addActionListener(this);stopItem.addActionListener(this);portItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);combobox=newJComboBox();combobox.insertItemAt(nEuODEEn,0);combobox.setSelectedlndex(O);messageShow=newJTextArea();messageShow.setEditable(false);messageScrollPane=newJScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(faceSize);messageScrollPane.revalidate();sysMessage=newJTextField(23);sysMessage.setEnabled(false);sysMessageButton=newJButton();sysMessageButton.setText("-^EIn);sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel=newJLabel(H-^EldA£OH);messageLabel=newJLabel(H-^EIIui^n);downPanel=newJPanel();girdBag=newGridBagLayout();downPanel.setLayout(girdBag);girdBagCon=newGridBagConstraints();girdBagCon.gridx=O;girdBagCon.gridy=O;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=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(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon=newGridBagConstraints();girdBagCon.gridx=4;girdBagCon.gridy=3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);showStatus=newJTextField(35);showStatus.setEditable(false);girdBagCon=newGridBagConstraints();girdBagCon.gridx=0;girdBagCon.gridy=5;girdBagCon.gridwidth=5;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){stopService();System.exit(0);}});}/***EA^^z|Ai*/@SuppressWarnings("deprecation")publicvoidactionPerformed(ActionEvente){Objectobj=e.getSource();if(obj==startServer||obj==startitem){//^o^—-^tn^EstartService();}elseif(obj==stopServer||obj==stopitem){//i£O「pfh%Eintj=JOptionPane.showConfirmDialog(this,H0«pAI£d1-^inA3?n,nI£d1-^tnn,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(j==JOptionPane.YES_OPTION){stopService();}}elseif(obj==portSet||obj==portitem){//^E^UEeOA//p-3b^EiUEeOApA^6»°idPortConfportConf=newPortConf(this);portConf.show();}elseif(obj==exitButton||obj==exititem){//IE3b3iDdintj=JOptionPane.showConfirmDialog(this,H0«pAdaIE3bA3?n,HIE3bn,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(j==JOptionPane.YES_OPTION){stopService();System.exit(O);}}elseif(obj==helpitem){//2Ep¥AidDpA°idu//p^3b°i0u^6»°^dHelphelpDialog=newHelp(this);helpDialog.show();}elseif(obj==sysMessage||obj==sysMessageButton){//•^EIIpI3iuI^sendSystemMessage();}}/***职6%—・pfh%E*/publicvoidstartService(){try{serverSocket=newServerSocket(port,10);messageShow.append(n-^in^EdN^-^6^—£-6Un+port+n^E^U0iiy...\nn);startServer.setEnabled(false);startltem.setEnabled(false);portSet.setEnabled(false);portltem.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();}/**10±O-^tn^E*/publicvoidstopService(){try{//IdEu6DEE-^EI-^tn^^i0±OpAiui^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);startltem.setEnabled(true);portSet.setEnabled(true);portltem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(H-^tn^EdN^-i0±O\nn);combobox.removeAllItems();combobox.addItem(nEu6DEEn);}catch(Exceptione){//System.out.println(e);}}/**idEu6DEE-^EI-^tn^^i0±OpAiui^*/publicvoidsendStopToAll(){intcount=userLinkList.getCount();inti=0;while(i<count){Nodenode=userLinkList.findUser(i);if(node==null){i++;continue;}try{node.output.writeQbject(H-^in10±OH);node.output.flush();}catch(Exceptione){//System.out.println("$$$"+e);}i++;}}/***IdEuODEE-^EIIui^*/publicvoidsendMsgToAll(Stringmsg){intcount=userLinkList.getCount();//OA»§xUEyinti=0;while(i<count){Nodenode=userLinkList.findUser(i);if(node==null){i++;continue;}try{node.output.writeQbject("却f3糖X”);node.output.flush();node.output.writeQbject(msg);node.output.flush();}catch(Exceptione){//System.out.println("@@@"+e);}i++;}sysMessage.setText("");}/***idiI»§^EOA»§-^Eliui^*/publicvoidsendSystemMessage(){StringtoSomebody=combobox.getSelectedItem().toString();Stringmessage=sysMessage.getText()+"\n”;messageShow.append(message);//IdEuODEE-^EIIui^if(toSomebody.equalsIgnoreCase(HEu6DEEH)){sendMsgToAll(message);}else{//IdA3ib6A»§-^Eliui^Nodenode=userLinkList.findUser(toSomebody);try{node.output.writeObject("却f3糖X”);node.output.flush();node.output.writeObject(message);node.output.flush();}catch(Exceptione){//System.out.println(""+e);}sysMessage.setText(nn);//^«-^Eliui^AipAiui^Qa^O}}publicstaticvoidmain(String[]args){newChatServer();}}packageliaotian;importjava.io.*;.*;importjavax.swing.*;/**聊天客户端消息收发类*/publicclassClientReceiveextendsThread{privateJComboBoxcombobox;privateJTextAreatextarea;Socketsocket;ObjectOutputStreamoutput;ObjectInputStreaminput;JTextFieldshowStatus;publicClientReceive(Socketsocket,ObjectOutputStreamoutput,ObjectInputStreaminput,JComboBoxcombobox,JTextAreatextarea,JTextFieldshowStatus){this.socket=socket;this.output=output;this.input=input;bobox=combobox;this.textarea=textarea;this.showStatus=showStatus;}publicvoidrun(){while(!socket.isClosed()){try{Stringtype=(String)input.readObject();if(type.equalsIgnoreCase("系统信息”)){Stringsysmsg=(String)input.readObject();textarea.append("系统信息:"+sysmsg);}elseif(type.equalsIgnoreCase("服务关闭”)){output.close();input.close();socket.close();textarea.append("服务器已关闭!\n");break;}elseif(type.equalsIgnoreCase("聊天信息”)){Stringmessage=(String)input.readObject();textarea.append(message);}elseif(type.equalsIgnoreCase("用户列表”)){Stringuserlist=(String)input.readObject();Stringusernames[]=userlist.split("\n");combobox.removeAllItems();inti=0;combobox.addItem("所有人");while(i<usernames.length){combobox.addItem(usernames[i]);i++;}combobox.setSelectedIndex(0);showStatus.setText("在线用户"+usernames.length+"人”);}}catch(Exceptione){System.out.println(e);}}}}packageliaotian;importjava.awt.*;importjava.awt.event.*;.*;importjavax.swing.*;/***生成连接信息输入的对话框*让用户输入连接服务器的IP和端口*/publicclassConnectConfextendsJDialog{/****/privatestaticfinallongserialVersionUID=1L;JPanelpanelUserConf=newJPanel();JButtonsave=newJButton();JButtoncancel=newJButton();JLabelDLGINFO=newJLabel("默认连接设置为:8888");JPanelpanelSave=newJPanel();JLabelmessage=newJLabel();StringuserInputIp;intuserInputPort;JTextFieldinputIp;JTextFieldinputPort;publicConnectConf(JFrameframe,Stringip,intport){super(frame,true);this.userInputIp=ip;this.userInputPort=port;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,130));this.setTitle("连接设置");message.setText("请输入服务器的IP地址:");inputIp=newJTextField(10);inputIp.setText(userInputIp);inputPort=newJTextField(4);inputPort.setText(""+userInputPort);save.setText("保存");cancel.setText("取消");panelUserConf.setLayout(newGridLayout(2,2,1,1));panelUserConf.add(message);panelUserConf.add(inputIp);panelUserConf.add(newJLabel("请输入服务器的端口号:"));panelUserConf.add(inputPort);panelSave.add(newLabel(""));panelSave.add(save);panelSave.add(cancel);"));panelSave.add(newLabel(ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayout());contentPane.add(panelUserConf,BorderLayout.NORTH);contentPane.add(DLGINFO,BorderLayout.CENTE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年供气合同样本3篇
- 2024年“通办”第二批指导目录应用推广合同3篇
- 2024年标准招标代理服务采购协议大纲版B版
- 贵州省劳保费管理案例研究
- 电信设备公司员工停薪留职
- 近郊别墅交易合同范本官方提供
- 2024年二零二四年度数据中心建设承包经营合同范本3篇
- 2024年度城市安防设施维护管理合同2篇
- 网络安全劳务租赁合同
- 建筑景观工程倒板施工协议
- MOOC 饲料毒物学-华中农业大学 中国大学慕课答案
- 第五单元《京腔昆韵》-欣赏 ☆姹紫嫣红 课件- 2023-2024学年人音版初中音乐八年级下册
- 中小学校园交通安全常识宣传
- 商业摄影智慧树知到期末考试答案2024年
- 国家粮食和物资储备局招聘考试试题及答案
- JTG F90-2015 公路工程施工安全技术规范
- 松果体区肿瘤护理
- 《施工现场安全防护标准化防高坠篇》测试附有答案
- 血管瘤护理措施
- 智能穿戴行业发展趋势
- 公共场所的肺结核消毒措施
评论
0/150
提交评论