Java网络通信技术实现基于CS模式的聊天室_第1页
Java网络通信技术实现基于CS模式的聊天室_第2页
Java网络通信技术实现基于CS模式的聊天室_第3页
Java网络通信技术实现基于CS模式的聊天室_第4页
Java网络通信技术实现基于CS模式的聊天室_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号200710165114武汉科技大学城市学院课程设计报告课程设计名称Java课程设计题目采用Java网络通信技术实现基于C/S模式的聊天室院系信息工程学部专业信息管理与信息系统班级1班姓名张峰指导教师于海平2023年01月07日编号:036题目:采用Java网络通信技术实现基于C/S模式的聊天室1课程设计教学条件要求eclipse/netbeans/Jbuilder2课程设计任务编写一个简易CS版聊天室,多个客户端可以同时发送信息,效劳器端监听并显示到客户端页面。1.要求可以实现多人同时在线聊天。2.要求客户端和效劳器端的界面采用Swing或SWT实现3.效劳器可以向多个客户进行播送通信。3课程设计报告书主要内容1需求分析2总体设计2.1设计的总体思想与算法描述2.2模块结构图2.3各功能模块的功能与处理流程描述2.4界面设计3各功能模块程序设计按照功能模块的功能与处理流程描述给出详细的程序代码,并给出重点语句的注释.4小结4课程设计要求1按时到机房签到,在指定机位上机。遵守机房纪律。2独立完成课程设计任务。指导教师到机位上指导学生和分时段验收学生完成的程序。3按时提交打印的课程设计报告书。5课程设计参考书[1]许文宪懂子建.Java程序设计教程与实训.北京:北京大学出版社,2005.[2]辛运帏.Java程序设计.北京:清华大学出版社,2004[3][美]Echel,B.Java编程思想〔第三版〕.北京:机械工业出版社,2005撰写者:江伟指导老师:于海平目录1需求分析12总体设计22.1设计的总体思想与算法描述22.2模块结构图22.3界面设计32.3.1管理员界面32.3.2登陆界面32.3.3聊天界面42.3.4文件发送界面52.3.5接受提示界面52.3.6选择保存界面62.3.7传输成功提示界面63程序设计74小结22参考文献231需求分析本系统是实现c/s模式的聊天室首先要建立侦听效劳,这个需求是效劳器端的需求。其次还应实现:用户登录,包括客户端请求登录以及效劳器端响应登录两个过程。收发聊天信息,包括客户端发送聊天信息以及效劳器端转发聊天信息两个过程。收发系统信息,由效劳器端发送给客户端的信息。用户下线,包括客户端请求下线以及效劳器响应请求两个过程,这个与用户登录类似,效劳器关闭。其中我还参加了文件传输功能,方便了用户文件的共享。2总体设计2.1设计的总体思想与算法描述依据需求分析的结果,该系统应设计成一个可以实现多人同时在线聊天功能的聊天软件,下面从软件的整体结构设计、界面设计、变量设计等方面阐述一下系统的总体设计。依据需求分析结果,设计应实现多人同时在线聊天,就应该分为效劳端和用户端两个端口。用户端把信息发送到效劳端,而后效劳端再把信息分发到各个用户端。2.2模块结构图图2.1模块结构图2.3界面设计管理员界面图2.2管理员界面登陆界面图2.3登陆界面聊天界面图2.4聊天界面文件发送界面图2.5文件发送界面接受提示界面图2.6接受提示界面选择保存界面图2.7选择保存界面传输成功提示界面图2.8传输成功提示界面程序设计packagecom.ff;importjava.io.*;import.*;importjava.util.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassStartServer{ publicstaticvoidmain(String[]args){ StartServerstartServer=newStartServer(); StartServer.ServerserverFrame=startServer.newServer(); } classServerextendsJFrame{ privateJScrollPanejp_rec; privateJScrollPanejp_send; privateJScrollPanejp_list; privateJTextAreajta_rec; privateJTextAreajta_send; privateJLabellbl_rec; privateJLabellbl_edit; privateJListjlist; privateJButtonbtnSend;//发送消息按钮 privateJButtonbtnT; privateDefaultListModellistModel; privateHashMap<String,SocketThread>allUserLink=newHashMap<String,SocketThread>();publicServer(){ init(); try{ ServerSocketserver_socket=newServerSocket(9999); while(true){ Socketclient_socket=server_socket.accept(); SocketThreaddealThread=newSocketThread( client_socket); newThread(dealThread).start(); } }catch(Exceptionex){ ex.printStackTrace(); } } publicvoidinit(){ this.setTitle("管理员平台"); this.setSize(800,400); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLocationRelativeTo(this); Containerc=this.getContentPane(); c.setLayout(null); jta_rec=newJTextArea(""); jta_send=newJTextArea(""); jp_rec=newJScrollPane(); jp_send=newJScrollPane(); jp_list=newJScrollPane(); lbl_rec=newJLabel("--消息记录--"); lbl_edit=newJLabel("--文本编辑--"); btnSend=newJButton("发送"); btnT=newJButton("T除成员"); listModel=newDefaultListModel(); jlist=newJList(listModel);jlist.setBorder(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); 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.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); }classSocketThreadextendsBaseTrans{ privatebooleanthreadON=true; publicSocketThread(Socketclient_socket){ super(client_socket); btnSend.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ messageEvent("code=001;msg=※※※※※※公告"+newDate().toLocaleString()+"※※※※※※※\r\n"+jta_send.getText()); jta_send.setText("");} }); btnT.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ if(jlist.getSelectedValue()!=null){ SocketThreadst=allUserLink.get(jlist.getSelectedValue().toString().trim());allUserLink.remove(jlist.getSelectedValue().toString().trim()); st.sendMessage("code=0"); messageEvent("code=001;msg=※※※※※※公告"+newDate().toLocaleString()+"※※※※※※※\r\n"+jlist.getSelectedValue()+"被管理员踢了出去!"); st.closeLink(); threadON=false; listModel.remove(jlist.getSelectedIndex()); } } }); }publicvoidmessageEvent(Stringmsg){ StringUtilstringUtil=newStringUtil(); stringUtil.AnalysisMessage(msg); Stringcode=stringUtil.getValueByKey("code"); if(code.equalsIgnoreCase("000")){ System.out.println("进入了001");listModel.addElement(stringUtil.getValueByKey("userName")); for(Iterator<String>it=allUserLink.keySet().iterator();it.hasNext();){allUserLink.get(it.next()).sendMessage("code=001;msg=※※※※※※公告"+newDate().toLocaleString()+"※※※※※※※\r\n"+stringUtil.getValueByKey("userName")+ "进入了聊天室,大家欢送他(她)吧!"); }allUserLink.put(stringUtil.getValueByKey("userName"),this); jta_rec.setText(jta_rec.getText()+"\r\n"+"※※※※※※公告"+newDate().toLocaleString()+"※※※※※※※\r\n"+stringUtil.getValueByKey("userName")+"进入了聊天室,大家欢送他(她)吧!"); jta_rec.setCaretPosition(jta_rec.getText().length());} elseif(code.equalsIgnoreCase("001")){ System.out.println("进入了001"); for(Iterator<String>it=allUserLink.keySet().iterator();it.hasNext();){ allUserLink.get(it.next()).sendMessage(msg);}jta_rec.setText(jta_rec.getText()+"\r\n"+stringUtil.getValueByKey("msg")); jta_rec.setCaretPosition(jta_rec.getText().length()); } elseif(code.equalsIgnoreCase("010")){ System.out.println("进入了010"); this.setFileName(stringUtil.getValueByKey("fileName")); this.setFileLength(Integer.parseInt(stringUtil .getValueByKey("fileSize"))); initFileOutputStream("./"); sendMessage("code=011"); }elseif(code.equalsIgnoreCase("012")){ System.out.println("进入了012"); sendMessage("code=013"); setSendFileFlag(true); }elseif(code.equalsIgnoreCase("014")){ System.out.println("进入了014"); for(Iterator<String>it=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.getValueByKey("username") +";fileName=" +getFileName() +";fileSize=" +getFileLength());}} }elseif(code.equalsIgnoreCase("016")){ System.out.println("进入了016"); sendFileData("./"+this.getFileName()); sendMessage("code=018"); }elseif(code.equalsIgnoreCase("017")){ for(Iterator<String>it=allUserLink.keySet().iterator();it.hasNext();){ if(this!=allUserLink.get(it.next())){ allUserLink.get(it.next()).initNet(); }}}}publicvoidrun(){ while(threadON){ receive();}}}}客户端代码packagecom.ff;importjava.io.*;import.*;importjava.util.Date;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassStartClient{ publicstaticvoidmain(String[]args){ StartClientsc=newStartClient(); StartClient.Clientclient=sc.newClient();} classClient{ publicClient(){ init();} publicvoidinit(){ try{ Socketclient_socket=newSocket(InetAddress.getLocalHost(),9999); newThread(newChatPanel(client_socket)).start();} catch(Exceptionex){ ex.printStackTrace();}} classChatPanelextendsBaseTrans{ privateStringuserName; privateJFramejThis; privateJLabellbl_rec; privateJLabellbl_edit; privateJTextAreajta_rec;//接收消息框 privateJTextAreajta_send;//发送消息框 privateJTextFieldjtxt_file; privateJScrollPanejp_rec; privateJScrollPanejp_send; privateJButtonbtnSelFile;//选择文件 privateJButtonbtnSend;//发送消息按钮 privateJFileChooserjfc;//文件选择器 publicChatPanel(Socketclient_socket){ super(client_socket); userName=JOptionPane.showInputDialog("请输入用户名:"); init();} publicvoidinit(){ jThis=newJFrame(); jThis.setTitle("你好:"+userName+"欢送进入聊天程序"); jThis.setSize(600,400); jThis.setDefaultCloseOperation(jThis.EXIT_ON_CLOSE); jThis.setLocationRelativeTo(jThis); Containerc=jThis.getContentPane(); c.setLayout(null); lbl_rec=newJLabel("--消息记录--"); lbl_edit=newJLabel("--文本编辑--"); jtxt_file=newJTextField(""); jta_rec=newJTextArea(""); jta_send=newJTextArea(""); jp_rec=newJScrollPane(); jp_send=newJScrollPane(); btnSelFile=newJButton("文件"); btnSend=newJButton("发送"); jfc=newJFileChooser(); 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,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(newActionListener(){ publicvoidactionPerformed(ActionEventae){ jfc.showOpenDialog(null); 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(newActionListener(){ publicvoidactionPerformed(ActionEventae){ sendMessage("code=001;msg="+userName+""+newDate().toLocaleString()+"\r\n"+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); publicvoidmessageEvent(Stringmsg){ StringUtilstringUtil=newStringUtil(); stringUtil.AnalysisMessage(msg); Stringcode=stringUtil.getValueByKey("code"); if(code.equalsIgnoreCase("0")){ this.closeLink(); JOptionPane.showMessageDialog(jThis,"您已近被管理员T走了,再见!"); jThis.dispose(); System.exit(0);} elseif(code.equalsIgnoreCase("001")){ System.out.println("进入到001");jta_rec.setText(jta_rec.getText()+"\r\n"+stringUtil.getValueByKey("msg")); jta_rec.setCaretPosition(jta_rec.getText().length());} elseif(code.equalsIgnoreCase("011")){ System.out.println("进入到011"); sendMessage("code=012"); } elseif(code.equalsIgnoreCase("013")){ System.out.println("进入到了013"); sendFileData(jtxt_file.getText().trim()); this.initNet(); jtxt_file.setText(""); sendMessage("code=014;username="+userName);} elseif(code.equalsIgnoreCase("015")){ System.out.println("进入到了015"); setFileName(stringUtil.getValueByKey("fileName"));setFileLength(Integer.parseInt(stringUtil.getValueByKey("fileSize"))); intresult=JOptionPane.showConfirmDialog(null,userName+","+stringUtil.getValueByKey("username")+"发文件【"+getFileName()+"】给你,要接受吗?","提示",JOptionPane.OK_CANCEL_OPTION); if(result==JOptionPane.OK_OPTION){ JFileChooserjfc=newJFileChooser(); jfc.setDialogTitle("请选择保存的目录...");jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); jfc.showOpenDialog(jThis); Stringpath=jfc.getSelectedFile().getPath(); initFileOutputStream(path+"/"); sendMessage("code=016"); setSendFileFlag(true); } elseif(result==JOptionPane.CANCEL_OPTION){ sendMessage("code=017");}} elseif(code.equalsIgnoreCase("018")){ JOptionPane.showMessageDialog(jThis,userName+",文件【"+getFileName()+"】传输成功","提示",JOptionPane.INFORMATION_ME

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论