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