《Java网络通信技术实现基于CS模式的聊天室.doc》由会员分享,可在线阅读,更多相关《Java网络通信技术实现基于CS模式的聊天室.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学学号号4武武 汉汉 科科 技技 大大 学学 城城 市市 学学 院院课程设计课程设计报报 告告课程课程设计设计名称名称JavaJava 课程设计课程设计题目题目采用采用 JavaJava 网络通信技术实现基于网络通信技术实现基于 C/SC/S 模模式的聊天室式的聊天室院院系系信息工程学部信息工程学部专专业业信息管理与信息系统信息管理与信息系统班班级级1 1 班班姓姓名名峰峰指导教师指导教师于海平于海平20102010 年年0101 月月0707日日1/27编号:编号:036036题目:采用采用 JavaJava 网络通信技术实现基于网络通信技术实现基于 C/SC/S 模式的聊天室模式的聊天室1
2、 1课程设计教学条件要求课程设计教学条件要求eclipse/eclipse/netbeans/netbeans/uilderuilder2 2课程设计任务课程设计任务编写一个简易 CS 版聊天室,多个客户端可以同时发送信息,服务器端监听并显示到客户端页面。1要求可以实现多人同时在线聊天。2要求客户端和服务器端的界面采用 Swing 或 SWT 实现3服务器可以向多个客户进行广播通信。3 3课程设计报告书主要容课程设计报告书主要容1需求分析2 总体设计21 设计的总体思想与算法描述22 模块结构图23 各功能模块的功能与处理流程描述24 界面设计3各功能模块程序设计按照功能模块的功能与处理流程描
3、述给出详细的程序代码,并给出重点语句的注释.4小结4 4课程设计要求课程设计要求1 按时到机房签到,在指定机位上机。遵守机房纪律。2 独立完成课程设计任务。指导教师到机位上指导学生和分时段验收学生完成的程序。3 按时提交打印的课程设计报告书。5 5课程设计参考书课程设计参考书1许文宪 懂子建.Java 程序设计教程与实训.:大学,2005.2辛运帏.Java 程序设计.:清华大学,20043美Echel,B.Java 编程思想(第三版).:机械工业,2005撰写者:江伟 指导老师:于海平目目录录1需求分析 12/272总体设计 221 设计的总体思想与算法描述 222 模块结构图 22.3 界
4、面设计 32.3.1 管理员界面 32.3.2 登陆界面 32.3.3 聊天界面 42.3.4 文件发送界面 42.3.5 接受提示界面 52.3.6 选择保存界面 52.3.7 传输成功提示界面 53 程序设计 64小结 21参考文献 221/271需求分析本系统是实现 c/s 模式的聊天室 首先要建立侦听服务,这个需服务器端的需求。其次还应实现:用户登录,包括客户端请求登录以与服务器端响应登录两个过程。收发聊天信息,包括客户端发送聊天信息以与服务器端转发聊天信息两个过程。收发系统信息,由服务器端发送给客户端的信息。用户下线,包括客户端请求下线以与服务器响应请求两个过程,这个与用户登录类似,
5、服务器关闭。其中我还加入了文件传输功能,方便了用户文件的共享。2/272总体设计21 设计的总体思想与算法描述依据需求分析的结果,该系统应设计成一个可以实现多人同时在线聊天功能的聊天软件,下面从软件的整体结构设计、界面设计、变量设计等方面阐述一下系统的总体设计。依据需求分析结果,设计应实现多人同时在线聊天,就应该分为服务端和用户端两个端口。用户端把信息发送到服务端,而后服务端再把信息分发到各个用户端。22 模块结构图图 2.1 模块结构图3/272.3 界面设计2.3.12.3.1 管理员界面图 2.2 管理员界面2.3.2 登陆界面图 2.3 登陆界面4/272.3.3 聊天界面图 2.4
6、聊天界面2.3.4 文件发送界面图 2.5 文件发送界面5/272.3.5 接受提示界面图 2.6 接受提示界面2.3.6 选择保存界面图 2.7 选择保存界面2.3.7 传输成功提示界面图 2.8 传输成功提示界面6/273程序设计package.ff;import java.io.*;import .*;import java.util.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class StartServer public static void main(String args)St
7、artServer startServer=new StartServer();StartServer.Server serverFrame=startServer.new Server();class Server extends JFrameprivate JScrollPane jp_rec;private JScrollPane jp_send;private JScrollPane jp_list;private JTextArea jta_rec;private JTextArea jta_send;private JLabel lbl_rec;private JLabel lbl
8、_edit;private JList jlist;7/27private utton btnSend;/发送消息按钮private utton btnT;private DefaultListModel listModel;privateHashMapallUserLink=newHashMap();public Server()init();try ServerSocket server_socket=new ServerSocket(9999);while(true)Socket client_socket=server_socket.accept();SocketThread deal
9、Thread=new SocketThread(client_socket);new Thread(dealThread).start();catch(Exception ex)ex.printStackTrace();public void init()this.setTitle(管理员平台);this.setSize(800,400);8/27this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLocationRelativeTo(this);Container c=this.getContentPane();c.setLayout(n
10、ull);jta_rec=new JTextArea();jta_send=new JTextArea();jp_rec=new JScrollPane();jp_send=new JScrollPane();jp_list=new JScrollPane();lbl_rec=new JLabel(-消息记录-);lbl_edit=new JLabel(-文本编辑-);btnSend=new utton(发送);btnT=new utton(T 除成员);listModel=new DefaultListModel();jlist=new JList(listModel);jlist.setB
11、order(BorderFactory.createTitledBorder(在线成员);jp_rec.getViewport().add(jta_rec);jp_send.getViewport().add(jta_send);jp_list.getViewport().add(jlist);jta_rec.setLineWrap(true);jta_send.setLineWrap(true);9/27jta_rec.setEditable(false);lbl_rec.setBounds(30,10,80,20);jp_rec.setBounds(30,30,450,100);lbl_e
12、dit.setBounds(30,130,80,20);jp_send.setBounds(30,150,450,100);btnSend.setBounds(350,260,80,20);jp_list.setBounds(500,30,120,220);btnT.setBounds(520,260,80,20);c.add(lbl_rec);c.add(lbl_edit);c.add(jp_rec);c.add(jp_send);c.add(btnSend);c.add(jp_list);c.add(btnT);this.setVisible(true);class SocketThrea
13、d extends BaseTrans private boolean threadON=true;public SocketThread(Socket client_socket)10/27super(client_socket);btnSend.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)messageEvent(code=001;msg=公告+newDate().toLocaleString()+rn+jta_send.getText();jta_send.setText(
14、););btnT.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)if(jlist.getSelectedValue()!=null)SocketThreadst=allUserLink.get(jlist.getSelectedValue().toString().trim();allUserLink.remove(jlist.getSelectedValue().toString().trim();st.sendMessage(code=0);messageEvent(code=
15、001;msg=公告+newDate().toLocaleString()+rn+jlist.getSelectedValue()+被管理员踢了出去!);st.closeLink();threadON=false;listModel.remove(jlist.getSelectedIndex();11/27);public void messageEvent(String msg)StringUtil stringUtil=new StringUtil();stringUtil.AnalysisMessage(msg);String code=stringUtil.getValueByKey(
16、code);if(code.equalsIgnoreCase(000)System.out.println(进入了 001);listModel.addElement(stringUtil.getValueByKey(userName);for(Iteratorit=allUserLink.keySet().iterator();it.hasNext();)allUserLink.get(it.next().sendMessage(code=001;msg=公 告+newDate().toLocaleString()+rn+stringUtil.getValueByKey(userName)+
17、进入了聊天室,大家欢迎他(她)吧!);allUserLink.put(stringUtil.getValueByKey(userName),this);jta_rec.setText(jta_rec.getText()+rn+公 告+newDate().toLocaleString()+rn+stringUtil.getValueByKey(userName)+进入了聊天室,大家欢迎他(她)吧!);12/27jta_rec.setCaretPosition(jta_rec.getText().length();else if(code.equalsIgnoreCase(001)System.o
18、ut.println(进入了 001);for(Iteratorit=allUserLink.keySet().iterator();it.hasNext();)allUserLink.get(it.next().sendMessage(msg);jta_rec.setText(jta_rec.getText()+rn+stringUtil.getValueByKey(msg);jta_rec.setCaretPosition(jta_rec.getText().length();else if(code.equalsIgnoreCase(010)System.out.println(进入了
19、010);this.setFileName(stringUtil.getValueByKey(fileName);this.setFileLength(Integer.parseInt(stringUtil.getValueByKey(fileSize);initFileOutputStream(./);sendMessage(code=011);else if(code.equalsIgnoreCase(012)System.out.println(进入了 012);13/27sendMessage(code=013);setSendFileFlag(true);else if(code.e
20、qualsIgnoreCase(014)System.out.println(进入了 014);for(Iteratorit=allUserLink.keySet().iterator();it.hasNext();)if(this!=allUserLink.get(it.next()SocketThreadst=allUserLink.get(it.next();st.setFileName(getFileName();st.setFileLength(getFileLength();st.sendMessage(code=015;username=+stringUtil.getValueB
21、yKey(username)+;fileName=+getFileName()+;fileSize=+getFileLength();else if(code.equalsIgnoreCase(016)System.out.println(进入了 016);sendFileData(./+this.getFileName();14/27sendMessage(code=018);else if(code.equalsIgnoreCase(017)for(Iteratorit=allUserLink.keySet().iterator();it.hasNext();)if(this!=allUs
22、erLink.get(it.next()allUserLink.get(it.next().initNet();public void run()while(threadON)receive();客户端代码package.ff;import java.io.*;import .*;import java.util.Date;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class StartClient public static void main(String args)StartClient s
23、c=new StartClient();StartClient.Client client=sc.new Client();15/27class Clientpublic Client()init();public void init()trySocketclient_socket=newSocket(InetAddress.getLocalHost(),9999);new Thread(new ChatPanel(client_socket).start();catch(Exception ex)ex.printStackTrace();class ChatPanel extends Bas
24、eTransprivate StringuserName;private JFramejThis;private JLabellbl_rec;private JLabellbl_edit;private JTextArea jta_rec;/接收消息框private JTextArea jta_send;/发送消息框private JTextField jtxt_file;private JScrollPane jp_rec;private JScrollPane jp_send;private utton btnSelFile;/选择文件16/27private utton btnSend;
25、/发送消息按钮private JFileChooser jfc;/文件选择器public ChatPanel(Socket client_socket)super(client_socket);userName=JOptionPane.showInputDialog(请输入用户名:);init();public void init()jThis=new JFrame();jThis.setTitle(你好:+userName+欢迎进入聊天程序);jThis.setSize(600,400);jThis.setDefaultCloseOperation(jThis.EXIT_ON_CLOSE);
26、jThis.setLocationRelativeTo(jThis);Container c=jThis.getContentPane();c.setLayout(null);lbl_rec=new JLabel(-消息记录-);lbl_edit=new JLabel(-文本编辑-);jtxt_file=new JTextField();jta_rec=new JTextArea();jta_send=new JTextArea();jp_rec=new JScrollPane();jp_send=new JScrollPane();btnSelFile=new utton(文件.);17/2
27、7btnSend=new utton(发送);jfc=new JFileChooser();jp_rec.getViewport().add(jta_rec);jp_send.getViewport().add(jta_send);jta_rec.setLineWrap(true);jta_send.setLineWrap(true);jtxt_file.setEditable(false);jta_rec.setEditable(false);jfc.setDialogTitle(请选择要传送的文件.);lbl_rec.setBounds(30,10,80,20);jp_rec.setBou
28、nds(30,30,450,100);lbl_edit.setBounds(30,130,80,20);jp_send.setBounds(30,150,450,100);jtxt_file.setBounds(30,260,150,20);btnSelFile.setBounds(180,260,80,20);btnSend.setBounds(350,260,80,20);btnSelFile.addActionListener(new ActionListener()public void actionPerformed(ActionEvent ae)jfc.showOpenDialog
29、(null);jtxt_file.setText(jfc.getSelectedFile().getPath()+););18/27c.add(lbl_rec);c.add(lbl_edit);c.add(jp_rec);c.add(jp_send);c.add(jtxt_file);c.add(btnSelFile);c.add(btnSend);btnSend.addActionListener(new ActionListener()public void actionPerformed(ActionEvent ae)sendMessage(code=001;msg=+userName+
30、newDate().toLocaleString()+rn+jta_send.getText();jta_send.setText();if(jtxt_file.getText().length()4)Filefile=newFile(jtxt_file.getText().trim();sendMessage(code=010;fileName=+file.getName()+;fileSize=+file.length();sendMessage(code=000;username=+userName);jThis.setVisible(true);public void messageE
31、vent(String msg)StringUtil stringUtil=new StringUtil();stringUtil.AnalysisMessage(msg);19/27String code=stringUtil.getValueByKey(code);if(code.equalsIgnoreCase(0)this.closeLink();JOptionPane.showMessageDialog(jThis,您已近被管理员T 走了,再见!);jThis.dispose();System.exit(0);else if(code.equalsIgnoreCase(001)Sys
32、tem.out.println(进入到 001);jta_rec.setText(jta_rec.getText()+rn+stringUtil.getValueByKey(msg);jta_rec.setCaretPosition(jta_rec.getText().length();else if(code.equalsIgnoreCase(011)System.out.println(进入到 011);sendMessage(code=012);else if(code.equalsIgnoreCase(013)System.out.println(进入到了 013);sendFileD
33、ata(jtxt_file.getText().trim();this.initNet();jtxt_file.setText();sendMessage(code=014;username=+userName);20/27else if(code.equalsIgnoreCase(015)System.out.println(进入到了 015);setFileName(stringUtil.getValueByKey(fileName);setFileLength(Integer.parseInt(stringUtil.getValueByKey(fileSize);intresult=JO
34、ptionPane.showConfirmDialog(null,userName+,+stringUtil.getValueByKey(username)+发文件+getFileName()+给你,要接受吗?,提示,JOptionPane.OK_CANCEL_OPTION);if(result=JOptionPane.OK_OPTION)JFileChooser jfc=new JFileChooser();jfc.setDialogTitle(请选择保存的目录.);jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);jfc.sho
35、wOpenDialog(jThis);String path=jfc.getSelectedFile().getPath();initFileOutputStream(path+/);sendMessage(code=016);setSendFileFlag(true);else if(result=JOptionPane.CANCEL_OPTION)sendMessage(code=017);else if(code.equalsIgnoreCase(018)21/27JOptionPane.showMessageDialog(jThis,userName+,文件+getFileName()
36、+传输成功,提示,JOptionPane.INFORMATION_MESSAGE);/jta_rec.setText(jta_rec.getText()+rn+msg);public void run()while(true)receive();4小结每次课程设计都是一个学习的升华,这次我做的课题是网络通信技术实现基于 C/S 模式的聊天室程序设计。为了使课程设计能够顺利的进行,刚拿到任务书,我就开始复习课本和软件工程中的相关知识,并去图书馆查阅了很多资料,大致熟悉了课题所需要的知识点。然后拟定 JAVA 设计的框架,全面布局设计的界面。22/27准备工作完成之后开始编写代码了,事实远超出了我
37、当初想象的那样简单。在实际的代码设计中,我碰到了很多难以解决的困难。首先是不知道怎么构建框架,等大致有了框架,却不知道怎么让这个框架有血有肉,去实现应有的功能。幸亏有指导老师的热情辅导和鼓励,为我迷途指津,才使得我的课程设计不至于夭折。所谓万事开头难,开始许多的小问题都会造成我的进程的停止,比如大小写没注意,括号没打好,常常一个小小的问题都会让我停滞不前,于是与同学们讨论。在这样浓浓的氛围中,学习效率极高,不到一个星期我就构建好了框架,并做了一些后续准备。因为有了开始的准备工作,后来的事情就简单多了。之前我上网查询相似代码学习借鉴,现在就把那些代码用上了,虽然常常出些问题,但是因为有老师的指导
38、,一切都迎刃而解,课程设计不久就完成了。最后我想说感老师和同学们,使他们的帮助才使得我的课程设计如此顺利的完成。但是完成之后我还是觉得有些遗憾,但是我努力了。所以我期望下次课程设计有更好的表现。参考文献1卫琴.JAVA 面向对象编程M.:电子工业.20062晨阳.Java 实用系统开发指南M.:机械工业.20083朱仲杰.Palm 应用程序设计使用 Java 语言M.:中国电力4迪特尔.Java 程序设计教程/国外经典教材M.:清华大学5蔡翠平.Java 程序设计.:清华大学,2003.23/27课程设计评分表课程设计评分表评分标准:评分标准:1.1.学生是否严格遵守课程设计纪律,按照规定时间
39、完成设计任务学生是否严格遵守课程设计纪律,按照规定时间完成设计任务(占占 30%)30%)2.2.程序设计的质量与规:程序设计的质量与规:(占占 40%)40%)(1)(1)是否采用了良好的设计方法,独立完成程序设计是否采用了良好的设计方法,独立完成程序设计(2)(2)程序界面设计是否合理、美观程序界面设计是否合理、美观(3)(3)数据库设计是否合理,具有良好的扩展性数据库设计是否合理,具有良好的扩展性(4)(4)程序是否运行正常,未见运行错误程序是否运行正常,未见运行错误24/273.3.课程设计报告书的质量与规课程设计报告书的质量与规(占占 30%)30%)教师评分:教师评分:1.1.学生出勤得分:学生出勤得分:_2.2.程序设计得分:程序设计得分:_3.3.设计报告得分:设计报告得分:_总分:总分:_教师评语:教师评语:根据该生在课程设计期间根据该生在课程设计期间,是否严格遵守课程设计纪律是否严格遵守课程设计纪律,按照规定时间完按照规定时间完成设计任务,完成的程序设计的质量与规,提交的课程设计报告书的质量与成设计任务,完成的程序设计的质量与规,提交的课程设计报告书的质量与规等多方面的评分,该生本次课程设计的评分为:规等多方面的评分,该生本次课程设计的评分为:_教师签名:教师签名:日期:年日期:年 月日月日