版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(完整)JAVA聊天室附完整代码专业课程设计I基于JAVA的聊天室设计与实现一、课题内容和要求基于网络的文本交互软件的设计和实现,设计和实现一个简单的基于网络的文本消息发送和接收软件。基本要求:该软件能实现文本消息发送和接收功能.提高要求(1):支持以多播方式发送文本消息,提高要求(2):性能稳定,界面友好.按课程设计报告的要求写出详细的设计和实现报告。二、设计思路分析聊天室是一项进行文本交互的软件,应用广泛,并且实用性强的一个非常典型的人机交互系统。在信息世界里,聊天工具的使用是非常频繁的,如1^小QQ、校内通之类的聊天工具许多人都正在使用。此次设计的聊天室系统主要针对文本信息的传送和接收,不能像QQ一样进行图片、音频、视频等文件的传输.虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养了面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解.人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务.一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1)聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等.(2)用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的(完整)JAVA聊天室附完整代码开放信息,还能看到对方的登录状态.(3)文件传输功能:用户可以共享资源,能发送及接收文件。(4)保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。(5)系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。三、概要设计1、聊天室的简要功能介绍该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、注销、查看在线用户等。(1)用户设置:功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)登录功能:功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;(3)公聊:功能描述:用户在聊天室中可以选择与“所有人"聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。(4)私聊:功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。双方的聊天记录对于聊天室的其他用户是不可见的。(5)聊天心情:功能描述:用户在聊天的过程中可以选择相应的心情来表达自己的情感。(6)系统消息:(完整)JAVA聊天室附完整代码功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。(7)用户的状态。功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态.(8)用户注销:功能描述:用户可以注销自己的账号,并重新登记登录名和地址。(9)用户退出:功能描述:用户可以在正常情况下退出聊天室.(10)服务端控制:功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。2、模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:127.0.0。1默认端口为8888。(1)聊天室服务端模块图:(完整)JAVA聊天室附完整代码端口服务:输入要侦听的端口,默认为8888;启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;停止服务:关闭服务器,侦听结束。客户端用户不能再聊天;发送系统消息:服务器端给所有人或者个别用户发送消息。消息显示:可以显示所有用户的聊天记录,和上线、下线信息。退出服务器:退出程序,并停止服务;(2)聊天室客户端模块图:用户设置:用户可以设置自己的用户名进行聊天;连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:127.0.0。1:8888;用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;用户注销:退出聊天,可以继续修改用户设置和连接设置;发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;退出:关闭所有聊天并退出客户端.(完整)JAVA聊天室附完整代码(3)流程图(3)流程图 用户设置设置用月名 默认连接地址或用户名 用户设置设置用月名 默认连接地址或用户名聊天室客户端设置IP设置IP地址和端口退出 连接设置四、详细设计四、详细设计1、聊天室服务器端设计:1、聊天室服务器端设计:(完整)JAVA聊天室附完整代码ServerListenserver:ServerSocketuserLinkList:UserLinkListisStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)聊天室服务端主要包括7个文件,它们的功能如下:(1)ChatServer.java:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。(2)ServerListen。java:该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类(卜6人汨吐[5土)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。(3)ServerReceive。java:该类是实现服务器端的消息的收发的类.该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上.(4)PortConfojava:该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类。(5)Node.java:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。UserLinkList.java:用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。(完整)JAVA聊天室附完整代码Helpo」2丫2:服务端程序的帮助类.2、聊天室客户端设计:聊天室客户端主要包括5个文件,它们的功能如下:(l)ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect。与DisConnect()方法实现与服务器的连接与断开连接。当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。⑵ClientReceive。java:该类是实现服务器端与客户端消息收发的类。ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。UserConfojava:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修
(完整)JAVA聊天室附完整代码改配置的类.Help.java:客户端程序的帮助类。五、测试数据及其结果分析1、首先运行ChatServer工程文件,会出现如下画面2、选择端口设置,可以设置您要侦听的端口号,不设置将默认端口号为8888;3、选择启动服务,服务器开始在您刚才设置的端口中侦听;(完整)JAVA聊天室附完整代码目叵冈后功眠四停止服苗国聊天空服务瑞目叵冈后功眠四停止服苗:^:端口设置让留端尸倒H动,在日柏喻匚而听...友城早:所由人友城早:所由人■发送发挺甜总发送4、运行ChatClient工程文件,打开如下画面5、选择用户设置可以设置自己的登录名(完整)JAVA聊天室附完整代码6、选择连接设置可以设置您的IP地址和端口号其中可以选择心情等;其中可以选择心情等;7、选择登录进入聊天室并可以开始跟所有人或者个别其他用户聊天,8、在服务端也可以选择给所有人或者个别用户发送消息;(完整)JAVA聊天室附完整代码注意:客户端只有在服务端开启的情况下才能正常聊天.9、多人聊天的服务器端与客户端情况同■K空里苏瑞 国司凰7 月前眼势痔止眼若退出讣法诟=,步尸斗,TT888at*i3iJnr..JI二讦升」斌用-DEFTI芸用尸叫上戕士苏打期?gg大上I也指mzen仁在射工电力场勺.-.■比工机的中工用大电士I■■;?,看;广电为生气地对所有人说4为T(mm醺笑地对所有人说.段电,质…-a-^'70---I/叫:bmm跳箕地对所亘A?.空气...gq生气地对月h上兄食堂里0群题,1JJ.则生气省对所有人显不相唱狂狂捌爱电对所有£说吃的俄9。三、他指盲亡人花」3^^五巨丁3匕30生\地对所有人说面向用F'll:M生1地对所有人说方便,功的强大狂狂悔笑地对厮白儿说昌的SM生气地对所有从院专业用践计杭运至:|所百人F相浴就荏俄用尸3人10(完整)JAVA聊天室附完整代码邕*天宜客户温揉住。卜出置©翻助世)f|ffiPM|ggiftS1登录|在间区出■毓』煦器成功…旖后忌K次好叼?g&雀芝氏廿©七八五en狂狂徽芝地.甘所万人说:睡好典常宪地对明再人说uur+'RiggEibUt内之,况误山广tmm就工地对所有人说:也吃.咻…系沆石总二王」卡电的叶也啊1tmm就工地对所有人说:空气...典三1法.甘所令人笠食空生的洋笆」吐JL士工皿三1b乱人笠壬坦V狂狂意美地对所有A.说:咆的惊箕三.所有.J.堂JS'/^A闫正=%箕三/出口]口有上笠面自用=1为明生行证对所有人说方便■功俄强大脸的笑地对所有A.说是的箕三所有」.笠三上臣理近一叫Q至U3I书WJ号-一一发送至:|所在人▼ 率甘:|俄关幽▼ 口胴悟话共送消息| 施送在娱用n3A代码如下:packageliaotian;/**大用户链表*/publicclassUserLinkList(Noderoot;Nodepointer;intcount;/**大构造用户链表*/publicUserLinkList(){root=newNode();rootonext=null;pointer=null;count=0;)/**大添加用户*/publicvoidaddUser(Noden){pointer=root;11(完整)JAVA聊天室附完整代码while(pointer。next!=null){pointer=pointer.next;}pointeronext=n;nonext=null;count++;)/***删除用户*/publicvoiddelUser(Noden){pointer=root;while(pointer.next!=null){if(pointer.next==n){pointeronext=n。next;count ;break;}pointer=pointeronext;)}/***返回用户数*/publicintgetCount(){returncount;}/***根据用户名查找用户*/publicNodefindUser(Stringusername){if(count==0)returnnull;pointer=root;while(pointer。next!=null){pointer=pointer.next;if(pointer.username.equalsIgnoreCase(username)){returnpointer;))returnnull;}/***根据索引查找用户12(完整)JAVA聊天室附完整代码*/publicNodefindUser(intindex){if(count==0) {returnnull;)if(index〈0) {returnnull;}pointer=root;inti=0;while(i〈index+1){if(pointer.next!=null){pointer=pointeronext;}else{returnnull;)i++;}returnpointer;)}packageliaotian;importjavaoawt.*;importjava.awtoevent。*;importjava.ioo*;importjavaonet.*;importjavax.swingo*;/**聊天客户端的主框架类*/publicclassChatClientextendsJFrameimplementsActionListener{/****/privatestaticfinallongserialVersionUID=1L;Stringip二”127.0。0.1";//连接到服务端的ip地址intport=8888;//连接到服务端的端口号StringuserName="狂狂";//用户名inttype=0;//0表示未连接,1表示已连接JComboBoxcombobox;//选择发送消息的接受者JTextAreamessageShow;//客户端的信息显示JScrollPanemessageScrollPane;/4U^显示的滚动条JLabelexpress,sendToLabel,messageLabel;JTextFieldclientMessage;//客户端消息的发送JCheckBoxcheckbox;//悄悄话13(完整)JAVA聊天室附完整代码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(”退出以)”,newImageIcon("face/smile.gif"));JMenuconMenu=newJMenu("设置(6");JMenuItemuserItem=newJMenuItem(”用户设置(U)",newImageIcon(”face/messenger_big。gif"));JMenuItemconnectItem=newJMenuItem("连接设置(0”,门63ImageIcon("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"));//设置运行时窗口的位置14(完整)JAVA聊天室附完整代码DimensionscreenSize=Toolkit。getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize。width-faceSize.getWidth())/2,(int)(screenSize。height-faceSize.getHeight())/2);this。setResizable(false);this.setTitle("聊天室客户端");//设置标题//为操作菜单栏设置热键’V'operateMenUosetMnemonic(’O');//为用户登录设置快捷键为ctrl+iloginItem.setMnemonic('I');loginItem°setAccelerator(KeyStroke.getKeyStroke(KeyEvent°VK_I,InputEvent.CTRL_MASK));//为用户注销快捷键为ctrl+llogoffItem。setMnemonic('L');logoffItem.setAccelerator (Keystroke 。 getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));//为退出快捷键为ctrl+xexitItem.setMnemonic('X');exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEventoVK_X,InputEventoCTRL_MASK));//为设置菜单栏设置热键'C’conMenu.setMnemonic('C');//为用户设置设置快捷键为ctrl+uuserItem。setMnemonic('U');userItem.setAccelerator(KeyStroke°getKeyStroke(KeyEvent°VK_U,InputEvent.CTRL_MASK));〃为连接设置设置快捷键为ctrl+cconnectItem。setMnemonic('C');connectItem。setAccelerator(KeyStroke。getKeyStroke(KeyEvent.VK_C,InputEvent。CTRL_MASK));//为帮助菜单栏设置热键'H'helpMenUosetMnemonic('H');//为帮助设置快捷键为ctrl+phelpItem。setMnemonic('H');helpItemosetAccelerator(KeyStroke.getKeyStroke(KeyEvent°VK_H,InputEvent.CTRL_MASK));}/**大程序初始化函数*/publicvoidinit(){ContainercontentPane=getContentPane();15(完整)JAVA聊天室附完整代码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);toolBaroadd(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("微笑地");actionlistoaddItem("高兴地");actionlistoaddItem("轻轻地");actionlistoaddItem("生气地");actionlistosetSelectedIndex(0);16(完整)JAVA聊天室附完整代码//初始时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();messageShoWosetEditable(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();17(完整)JAVA聊天室附完整代码girdBag=newGridBagLayout();downPanelosetLayout(girdBag);girdBagCon=newGridBagConstraints();girdBagConogridx=0;girdBagCon.gridy=0;girdBagCon.gridwidth=5;girdBagConogridheight=2;girdBagCon.ipadx=5;girdBagCon.ipady=5;JLabelnone=newJLabel("");girdBagosetConstraints(none,girdBagCon);downPanel.add(none);girdBagCon=newGridBagConstraints();girdBagConogridx=0;girdBagCon.gridy=2;girdBagCon.insets=newInsets(1,0,0,0);//girdBagConoipadx=5;//girdBagConoipady=5;girdBag.setConstraints(sendToLabel,girdBagCon);downPaneloadd(sendToLabel);girdBagCon=newGridBagConstraints();girdBagCon.gridx=1;girdBagConogridy=2;girdBagConoanchor=GridBagConstraintsoLINE_START;girdBagosetConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon=newGridBagConstraints();girdBagConogridx=2;girdBagCon.gridy=2;girdBagCon.anchor=GridBagConstraints.LINE_END;girdBagosetConstraints(express,girdBagCon);downPanel.add(express);girdBagCon=newGridBagConstraints();girdBagConogridx=3;girdBagConogridy=2;girdBagConoanchor=GridBagConstraintsoLINE_START;//girdBagConoinsets=newInsets(1,0,0,0);//girdBagConoipadx=5;//girdBagConoipady=5;girdBag.setConstraints(actionlist,girdBagCon);downPaneloadd(actionlist);18(完整)JAVA聊天室附完整代码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);downPaneloadd(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;girdBagosetConstraints(clientMessageButton,girdBagCon);downPanel。add(clientMessageButton);showStatus二newJTextField(35);showStatus。setEditable(false);girdBagCon=newGridBagConstraints();girdBagCon。gridx=0;girdBagCon。gridy=5;girdBagCon.gridwidth=5;girdBagosetConstraints(showStatus,girdBagCon);downPanel。add(showStatus);contentPane.add(messageScrollPane,BorderLayout。CENTER);contentPane.add(downPanel,BorderLayout。SOUTH);//关闭程序时的操作this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){19(完整)JAVA聊天室附完整代码if(type=1){DisConnect();}System.exit(0);}});)/***事件处理*/publicvoidactionPerformed(ActionEvente){Objectobj=e.getSource();if(obj==useritemI|obj==userButton){//用户信息设置//调出用户信息设置对话框UserConfuserConf=newUserConf(this,userName);userConf.setVisible(true);userName=userConf。userinputName;}elseif(obj==connectitemI|obj==connectButton){〃连接服务端设置〃调出连接设置对话框ConnectConfconConf=newConnectConf(this,ip,port);conConfosetVisible(true);ip=conConfouserinputip;port=conConfouserinputPort;}elseif(obj==loginitemI|obj==loginButton){//登录Connect();}elseif(obj==logoffitem||obj==logoffButton){〃注销DisConnect();showStatus.setText("");}elseif(obj二二clientMessage|Iobj二二clientMessageButton){//发送消息SendMessage();clientMessage.setText(””);}elseif(obj==exitButtonI|obj==exititem){//退出intj=JOptionPane.showConfirmDialog(计15,“真的要退出吗?”,”退出",JOptionPane.YES_OPTiON,JOptionPane。QUESTiON_MESSAGE);if(j=JOptionPane.YES_OPTiON){if(type=1){DisConnect();}Systemoexit(0);20(完整)JAVA聊天室附完整代码}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());outputoflush();input=newObjectinputStream(socketogetinputStream());outputowriteObject(userName);outputoflush();recvThread=newClientReceive(socket,output,input,combobox,messageShow,showStatus);recvThread.start();loginButton.setEnabled(false);loginitemosetEnabled(false);userButton.setEnabled(false);useritemosetEnabled(false);connectButtonosetEnabled(false);connectitem.setEnabled(false);logoffButton.setEnabled(true);logoffitemosetEnabled(true);clientMessageosetEnabled(true);messageShow.append("连接服务器"+ip+”:"+port+”成功.o.\n");type=1;//标志位设为已连接}catch(Exceptione){System.outoprintln(e);return;21(完整)JAVA聊天室附完整代码)publicvoidDisConnect(){loginButton。setEnabled(true);loginltem.setEnabled(true);userButton。setEnabled(true);useritem。setEnabled(true);connectButton。setEnabled(true);connectitem。setEnabled(true);logoffButton。setEnabled(false);logoffltem.setEnabled(false);clientMessage。setEnabled(false);if(socketoisClosed()){return;}try{outputowriteObject("用户下线");output.flush();input.close();outputoclose();socketoclose();messageShow.append("已经与服务器断开连接.。.\门“);type=0;〃标志位设为未连接}catch(Exceptione){//})publicvoidSendMessage(){StringtoSomebody=combobox.getSelectedltem().toString();Stringstatus="”;if(checkbox.isSelected()){status="悄悄话";)Stringaction=actionlist.getSelectedltem()。toString();Stringmessage=clientMessage.getText();if(socket.isClosed()){return;}try{output.writeObject("聊天信息");output.flush();output.writeObject(toSomebody);22(完整)JAVA聊天室附完整代码output.flush();outputowriteObject(action);outputoflush();output.writeObject(action);output.flush();output.writeObject(message);output.flush();)catch(Exceptione){//}}publicstaticvoidmain(String1]args){newChatClient();))packageliaotian;importjavaoawt.*;importjavaoawt.event.*;importjavaonet。*;importjavax.swing.*;publicclassChatServerextendsJFrameimplementsActionListener(publicstaticintport=8888;//・b1行正-rO1〕y^E6UServerSocketserverSocket;//,^\n^ESocketJComboBoxcombobox;JTextAreamessageShow;JTextFieldshowStatus;JScrollPanemessageScrollPane;JLabelsendToLabel,messageLabel;JTextFieldsysMessage;JButtonsysMessageButton;UserLinkListuserLinkList;JMenuBarjMenuBar二newJMenuBar();JMenuserviceMenu二newJMenu("・b1n”);JMenultemportitem二newJMenultem("^E6UEe0A”);JMenultemstartitem二newJMenuitem(”正6T"b1n");JMenultemstopitem二newJMenultem(”f£01"bln”);JMenultemexitltem二newJMenultem("fE3o”);JMenuhelpMenu二newJMenu("°i0u”);JMenultemhelpltem二newJMenultem(”°i0u”);23(完整)JAVA聊天室附完整代码JToolBartoolBar二newJToolBar();JButtonportSet;JButtonstartServer;JButtonstopServer;JButtonexitButton;〃士o%Uz6DiDimensionfaceSize=newDimension(400,600);ServerListenlistenThread;JPaneldownPanel;GridBagLayoutgirdBag;GridBagConstraintsgirdBagCon;/***•b।n^E1101°Ey*/publicChatServer(){init();//3oE%» 31Dothis。setDefaultCloseOperation(JFrame。EXIT_ON_CLOSE);this.pack();this.setSize(faceSize);this.setVisible(true);//EeOAQEDDE±’°6UI»0ADimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();thisosetLocation((int)(screenSize。width-faceSize。getWidth())/2, (int)(screenSize.height-faceSize.getHeight())/2);this.setResizable(false);this.setTitle("AA11E0,bIn^E”);}publicvoidinit(){ContainercontentPane=getContentPane();contentPaneosetLayout(newBorderLayout());serviceMenu.add(portitem);serviceMenuoadd(startitem);serviceMenuoaddSeparator();serviceMenuoadd(stopItem);serviceMenu.addSeparator();serviceMenuoadd(exititem);jMenuBar.add(serviceMenu);helpMenu.add(helpitem);jMenuBaroadd(helpMenu);setJMenuBar(jMenuBar);//3oE%» °'A¥portSet二newJButton("^E6UEe0A");startServer二newJButton("正6T"bIn");stopServer二newJButton("f£01"bIn");exitButton二newJButton("fE3o");toolBaroadd(portSet);24(完整)JAVA聊天室附完整代码toolBar。addSeparator();toolBar.add(startServer);toolBaroadd(stopServer);toolBar。addSeparator();toolBar.add(exitButton);contentPane。add(toolBar,BorderLayout。NORTH);stopServer.setEnabled(false);stopItem。setEnabled(false);startItem.addActionListener(this);stopItemoaddActionListener(this);portItemoaddActionListener(this);exitltem.addActionListener(this);helpItem。addActionListener(this);portSet.addActionListener(this);startServer.addActionListener(this);stopServer。addActionListener(this);exitButton.addActionListener(this);combobox=newJComboBox();comboboxoinsertItemAt("Eu0DEE",0);combobox.setSelectedIndex(0);messageShow=newJTextArea();messageShow.setEditable(false);newmessageScrollPane 二newJScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPaneHORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(faceSize);messageScrollPane.revalidate();sysMessage=newJTextField(23);sysMessage。setEnabled(false);sysMessageButton=newJButton();sysMessageButton.setText(”,CEf");sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel二newJLabel(""CEf0A£5”);messageLabel二newJLabel(",CEfTuTC”);downPanel=newJPanel();girdBag=newGridBagLayout();downPanel。setLayout(girdBag);girdBagCon=newGridBagConstraints();girdBagCon.gridx=0;25(完整)JAVA聊天室附完整代码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;girdBagosetConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon=newGridBagConstraints();girdBagCon。gridx=1;girdBagCon。gridy=2;girdBagCon.anchor二GridBagConstraints.LINE_START;girdBagcsetConstraints(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;girdBagcsetConstraints(sysMessage,girdBagCon);downPanel□add(sysMessage);girdBagCon=newGridBagConstraints();girdBagCon。gridx=4;girdBagCon.gridy=3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);showStatus=newJTextField(35);26(完整)JAVA聊天室附完整代码showStatus.setEditable(false);girdBagCon=newGridBagConstraints();girdBagCon.gridx=0;girdBagCon.gridy=5;girdBagCon。gridwidth=5;girdBagosetConstraints(showStatus,girdBagCon);downPaneloadd(showStatus);contentPane。add(messageScrollPane,BorderLayout.CENTER);contentPane。add(downPanel,BorderLayout.SOUTH);thisoaddWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){stopService();Systemoexit(0);)});)/***EA%bzIAi*/@SuppressWarnings("deprecation")publicvoidactionPerformed(ActionEvente){Objectobj=e。getSource();if(obj==startServer||obj==startitem){//正6T•b^n^EstartService();}elseif(obj==stopServer||obj==stopitem){//f£01•b^nTEintj=JOptionPane.showConfirmDialog(this,”0^^AI£0i-blnAd?”,”I£01-bln”,JOptionPane。YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(j=JOptionPaneoYES_OPTION){stopService();}}elseif(obj二二portSet||obj二二portitem){//TEeUEe0A〃|i-F3oTEeUEeQA^ATO»°eoPortConfportConf=newPortConf(this);portConfoshow();}elseif(obj==exitButton||obj==exititem){//fE3o3]gointj=JOptionPane。showConfirmDialog(this,"0出(iA0aIE3oAd?","lE3o”,27(完整)JAVA聊天室附完整代码JOptionPane。YES_OPTION,JOptionPane.QUESTION_MESSAGE);if(j=JOptionPane。YES_OPTION){stopService();System.exit(0);}}elseif(obj==helpitem){//2E^¥AJ0D^AI0u〃|i-F3o°I0u^0»°6oHelphelpDialog=newHelp(this);helpDialog.show();}elseif(obj==sysMessage||obj==sysMessageButton){//,CEfT|i\3TQ\CsendSystemMessage();})/**正6T・bi齐TE/publicvoidstartService(){try{serverSocket=newServerSocket(port,10);messageShow.append ( ”"^TnTEON% 。正6T£-0U”+port+”TE6U01Iy...\n");startServer.setEnabled(false);startItemosetEnabled(false);portSetosetEnabled(false);portItem.setEnabled(false);stopServer。setEnabled(true);stopItemosetEnabled(true);sysMessage.setEnabled(true);)catch(Exceptione){//Systemooutoprintln(e);}userLinkList=newUserLinkList();listenThread=newServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThreadostart();}/**大10±0•b।nTE/28(完整)JAVA聊天室附完整代码publicvoidstopService(){try(//IoEu0DEE-CEI•b।行正H-10±0^AIuICsendStopToAll();listenThread.isStop=true;serverSocketoclose();intcount=userLinkList。getCount();inti=0;while(i<count){Nodenode=userLinkList.findUser(i);node.input。close();nodeooutputoclose();node.socketoclose();++;)stopServer。setEnabled(false);stopitemosetEnabled(false);startServer.setEnabled(true);startitem.setEnabled(true);portSet.setEnabled(true);portitemosetEnabled(true);sysMessage.setEnabled(false);messageShoWoappend("・b1n^E0N%.10±0\n");combobox.removeAllitems();combobox.additem(”Eu0DEE");}catch(Exceptione){//System.out.println(e);}}/***IoEu0DEE-CEI•bIn正H-i。±q^AIuIC*/publicvoidsendStopToAll(){intcount=userLinkList.getCount();inti=0;while(i<count){Nodenode=userLinkList.findUser(i);if(node==null){i++;continue;29(完整)JAVA聊天室附完整代码try{node°output.writeObjectC>b1n10±0");node。output.flush();}catch(Exceptione){//Systemoout。println("$$$”+e);)i++;))/**・・ ・・ , 、・・ V■/«« ・・*IoEDODEE-CEIIOIC*/publicvoidsendMsgToAll(Stringmsg){intcount二userLinkList.getCount();//OA»§XUEyinti二0;while(i〈count){Nodenode=userLinkList。findUser(i);if(node==null){i++;continue;)try{node。outputowriteObject("T|if3DAIC");node。outputoflush();node.outputowriteObject(msg);node。outputoflush();)catch(Exceptione){//System.outoprintln("@@@"+e);)i++;)sysMessage.setText("");}/***ToiI»§TEOA»§•CEITOTC*/publicvoidsendSystemMessage(){StringtoSomebody=combobox。getSelectedItem().toString();Stringmessage=sysMessage.getText()+"\n”;messageShoWoappend(message);//IoEuODEE-CEIIOICif(toSomebody。equalsIgnoreCase(”EuODEE")){sendMsgToAll(message);30(完整)JAVA聊天室附完整代码)else{//IoA3,o0A»§•CEIIuICNodenode=userLinkList。findUser(toSomebody);try{node。output.writeObject("T|i\3RATC");node.output。flush();node。outputowriteObject(message);node。output.flush();}catch(Exceptione){//System。out.println(""+e);}sysMessagecsetText(””);//%«,CEfTuTCAJ|iATuTCQa60})publicstaticvoidmain(String[]args){newChatServer();)}packageliaotian;importjava。io.*;importjava。net。*;importjavaxcswing.*;/*大聊天客户端消息收发类*/publicclassClientReceiveextendsThread{privateJComboBoxcombobox;privateJTextAreatextarea;Socketsocket;ObjectOutputStreamoutput;ObjectInputStreaminput;JTextFieldshowStatus;publicClientReceive(Socketsocket,ObjectOutputStreamoutput,ObjectInputStreaminput,JComboBoxcombobox,JTextAreatextarea,JTextFieldshowStatus){this.socket=socket;this.output=output;this。input=input;this。combobox=combobox;this。textarea=textarea;31(完整)JAVA聊天室附完整代码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家政服务人员合同(2026年家庭)
- 2026福建省厦松城建投资有限公司招聘1人备考题库附答案详解(能力提升)
- 2026浙江台州市能投电力建设有限公司招聘2人备考题库及答案详解(新)
- 2026年神农架林区公共检验检测中心专项公开招聘工作人员备考题库有完整答案详解
- 富顺县2026年“筑梦巴蜀万才兴农”行动第一批岗位招聘备考题库(45人)含答案详解(研优卷)
- 2026国防科技大学星光幼儿园招聘教职工2人备考题库及答案详解(夺冠)
- 2026新疆兵投检验检测有限责任公司招聘5人备考题库含答案详解(培优b卷)
- 2026平高集团威海高压电器有限公司招聘备考题库及答案详解(考点梳理)
- 2026甘肃酒泉金塔县总医院招聘聘用制工作人员招聘27人备考题库附答案详解(培优)
- 2026广东江门市江海区银信资产管理有限公司招聘2人备考题库及答案详解一套
- HG∕T 4628-2014 工业用偏二氯乙烯
- 国企集团公司各岗位廉洁风险点防控表格(廉政)范本
- NB-T20119-2012核电工程施工物项管理规定
- 社区老年服务与关怀
- 2023阿里淘宝村报告
- 物的社会生命与物的商品
- 便利店货架之空间管理
- 简单钢板购销合同
- 无人机航空摄影测量数据获取与处理PPT完整全套教学课件
- 康复评定学课件:感觉功能评定
- 全国优质课一等奖初中数学七年级下册《实数》公开课精美课件
评论
0/150
提交评论