-1-JIANGXIAGRICULTURALUNIVERSITYJAVA课程设计报告题目:聊天室程序设计学院:姓名:学号:专业:年级:指导教师:2011年12月-2-一、系统需求分析1、课题背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、MSN,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个有简单聊天功能的网络聊天程序;而且通过制作该程序还能更好的学习网络软件编程知识。本课程适用于软件工程等本科专业。参加本课程设计的学生,应当认真完成本课程设计的全部过程。并以最终课程设计成果来证明其独立完成各种实际任务的能力。从而,反映出理解和运用本课程知识的水平和能力。2、功能要求运用java程序编写聊天室,实现简单的聊天功能。它是图形界面,线程,流与文件系统等技术的综合应用。其界面主要采用了java.awt包,java.swing包以及java.util包等。程序实现了聊天室的基本功能,其中有:1、启动服务器。2、进入客户端界面。3、登录聊天室。4、发送信息(实现按回车键发送消息)。5、关闭服务器。3、运行环境本程序基于java和UltraEdit开发环境,可以在一般的装有windows系统的主机上运行。4、功能实现1、采用套接字实现网络中的数据传输2、尽量使用某个或某些应用层的协议实现系统的部分功能3、系统设计规范合理,操作流程方便简单二、系统总体设计1、设计思路聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。1.首先通过继承JFrame类构造服务器界面。2.设计客户端程序使其能够完成正常的通信功能,并且可以更改背景颜色,设置字体颜色。3.设计侦听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。-3-2、各个模块详细的功能描述。1、服务器端功能描述:启动服务器端。2、客户端功能描述:启动客户端;显示登录昵称:显示系统时间:显示聊天记录:发送信息(实现按回车键发送消息);退出聊天室。三、系统详细设计1、界面设计主要由类ChatRoom来实现,界面实际总体如下:输入昵称的文本框,输入IP地址的文本框以及输入端口的文本框(可设置背景色);侦听,连接的按钮(可设置字体);推出按钮;接受消息的文本域(可设置前景色);发送消息文本框;发送按钮;插入图片。2、详细代码设计聊天室程序设计详细代码如下:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.net.*;importjava.io.*;importjava.util.*;publicclassChatRoomextendsJFrameimplementsActionListener,Runnable,KeyListener{ImageImage;privateTextAreata;privateJTextFieldip;privateJTextFieldport;privateJButtonss_server;privateJButtonss_client;privateJTextFieldsend_text;privateJTextFieldname;privateJButtonss_send;privateJButtonss_exit;privateSocketskt;publicvoidkeyReleased(KeyEventf){}publicvoidkeyPressed(KeyEventf){-4-if(f.getKeyCode()==KeyEvent.VK_ENTER){try{PrintWriterpw=newPrintWriter(skt.getOutputStream());Strings1=name.getText();Strings=send_text.getText();if(s==null)return;Calendarca=newGregorianCalendar();inthh=ca.get(Calendar.HOUR_OF_DAY);intmm=ca.get(Calendar.MINUTE);intss=ca.get(Calendar.SECOND);Stringtime=newString(hh+:+mm+:+ss+);ta.append(time+s1+说:+\n+s+\n);Strings3=time+s1+说:+\n+s;pw.println(s3);pw.flush();send_text.setText();}catch(Exceptione){ta.append(发送失败!\n);}}}publicvoidkeyTyped(KeyEventf){}publicvoidrun(){try{BufferedReaderbr=newBufferedReader(newInputStreamReader(skt.getInputStream()));while(true){Strings=br.readLine();if(s==null)break;ta.append(s+\n);}}catch(Exceptione){e.printStackTrace();}}publicvoidactionPerformed(ActionEvente){if(e.getSource()==ss_server){-5-doServer();}if(e.getSource()==ss_client){doClient();}if(e.getSource()==ss_send){doSend();}if(e.getSource()==ss_exit){doexit();}}publicvoiddoServer(){try{ServerSocketserver=newServerSocket(Integer.parseInt(port.getText()));skt=server.accept();ta.append(连接服务器成功!\n);newThread(this).start();}catch(Exceptione){ta.append(服务器启动失败!\n);}}publicvoiddoClient(){try{skt=newSocket(ip.getText(),Integer.parseInt(port.getText()));ta.append(连接服务器成功!\n);newThread(this).start();}catch(Exceptione){ta.append(连接失败!\n);}}publicvoiddoSend(){try{PrintWriterpw=newPrintWriter(skt.getOutputStream());Strings1=name.getText();-6-Strings=send_text.getText();if(s==null)return;Calendarca=newGregorianCalendar();inthh=ca.get(Calendar.HOUR_OF_DAY);intmm=ca.get(Calendar.MINUTE);intss=ca.get(Calendar.SECOND);Stringtime=newString(hh+:+mm+:+ss+);ta.append(time+s1+说:+\n+s+\n);Strings3=time+s1+说:+\n+s;pw.println(s3);pw.flush();send_text.setText();}catch(Exceptione){ta.append(发送失败!\n);}}publicvoiddoexit(){System.exit(0);}publicChatRoom(){Panela1=newPanel();Panela2=newPanel();Panela3=newPanel();this.setTitle(聊天室);this.setBounds(200,200,600,500);Containercc=this.getContentPane();JPanelp1=newJPanel();cc.add(p1,BorderLayout.NORTH);p1.setBackground(newColor(200,200,250));ta=newTextArea();cc.add(ta,BorderLayout.CENTER);JPanelp2=newJPanel();cc.add(p2,BorderLayout.SOUTH);p2.setBackground(newColor(250,150,200));ta.setForeground(newColor(0,0,250));JLabelp3=newJLabel(newImageIcon(2010.jpg));-7-cc.add(p3,BorderLayout.EAST);p1.add(newJLabel(昵称:));name=newJTextField(,6);p1.add(name);name.setFont(newFont(宋体,Font.BOLD,14));p1.add(newJLabel(IP:));ip=newJTextField(127.0.0.1,15);p1.add(ip);p1.add(newJLabel(Port:));port=newJTextField(7777,4);p1.add(port);ss_server=newJButton(侦听);ss_server.setForeground(newColor(150,100,250));ss_server.setFont(newFont(宋体,Font.BOLD,14));p1.add(ss_server);ss_client=newJButton(连接);ss_client.setForeground(newColor(150,100,250));ss_client.setFont(newFont(宋体,Font.BOLD,14));p1.add(ss_client);ss_exit=newJButton(退出);ss_exit.setForeground(newColor(150,100,250));ss_exit.setFont(newFont(宋体,Font.BOLD,14));p1.add(ss_exit);p2.setLayout(newBorderLayout());p2.add(newJLabel(发送消息:),BorderLayout.WEST);p2.setBackground(newColor(200,200,250));send_text=newJTextField(在?);p2.add(send_text,BorderLayout.CENTER);ss_send=newJButton(发送);p2.add(ss_send,BorderLayout.EAST);ss_exit.addActionListener(this);send_text.addKeyListener(this);ss_server.addActionListener(this);ss_client.addActionListener(this);ss_send.addActionListen