您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 基于Socket的网络聊天系统开发与设计
唐山师范学院题目:B/S架构基于JSP的在线购物中购物车的设计与实现系别:计算机科学系班级:08计本学号:081220141021姓名:刘冉1.1课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是一次全面的综练习。本课程设计的目的和任务:1.巩固和加深学生对java语言的基本知识的理解和掌握2.掌握java语言编程和程序调试的基本技能3.利用java语言进行基本的网络软件设计4.掌握书写程序设计说明文档的能力5.提高运用java语言解决实际问题的能力1.2课程设计的实验环境硬件要求能运行Windows2000/XP操作系统的微机系统。Java语言程序设计及相应的开发环境。1.3课程设计的预备知识熟悉java语言及Jcreator开发工具。2.1系统功能聊天交流是目前互联网提供的主要内容。聊天系统有多种实现方式,类似ICQ属于一种点对点的聊天系统;还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登陆统一的聊天服务器。在基于Socket的聊天系统中,主要有两种角色:服务器和客户端,不同的客户端登陆集中式的服务器,通过服务器将一个客户端发出的信息推送到其他所有客户端。基于Socket的聊天系统最早实现是使用网页刷新方式,通过客户端不断地自动刷新,将服务器端整个页面内容下载到客户端显示,这种方式的聊天速度慢,而且有刷屏现象,很快被更新的聊天技术所替代。聊天系统在客户端和服务器之间主要传送的是文字信息,服务器端只需要把最近的文字信息推送到客户端,这样减少了网络传输内容,节省了网络传输的时间,无疑提高了聊天速度。这种“推”技术是目前基于Socket聊天系统的主要实现技术。在基于Socket的聊天系统,客户端和服务器必须保持随时随地的连接。这有别于普通Web浏览的连接方式。在使用浏览器访问服务器时,先由客户端发出HTTP协议,然后服务器响应处理这个客户端的响应,再返回处理结果;请求(Request)和响应(Response)是一种一对一的前后因果关系。而在基于Socket的聊天系统中,客户端发出聊天信息的同时,客户端也在接受服务器发送过来的其他人的聊天信息,因此,请求和响应不存在那种前后对应关系,是两种分别独立进行的进程。因为服务器任何时候都可能发送信息到客户端,因此,客户端和服务器一旦建立连接,必须能让服务器在以后发送中寻找定位到这个连接。聊天客户端:实现与服务端的连接,建立和维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接受对方的响应。实现与其他用户的文本的发送,并实现聊天的功能。“主机名”文本框:用于输入聊天室服务器的IP地址或者是聊天室服务器的机器名字。“端口号”文本框:聊天室服务器进行听的端口号。“昵称”文本框:登录聊天室服务器的用户名,如果为空,单击“连接”按钮时会提示用户输入用户名。“连接”按钮:单击该按钮会连接到聊天室服务器。“断开”按钮:单击该按钮会退出聊天室服务器。“公聊”:单击实现公聊功能。“私聊”:单击实现私聊功能。2.2系统实现(1).功能设计。1.定义常量。2.服务端主页面类的实现:设置主页面的位置大小等基本信息并声明主要控件。在按钮监听接口方法内进行判断,若按下连接则先进行客户端检查,正确的话则启动服务器端的进程类,创建SocketService监听端口并通过while循环等待客户端的连接同时启动服务端的服务器代理类,其中封装了Socket网络编程的内容,通过客户端传来的相应标志位实现客户端的昵称冲突,在线人数,关闭客户端,公聊私聊等功能请求。3.客户端页面类的实现:变成结果设计与服务端相似,页面设计上根据功能有主机名,端口号,昵称,连接断开,公聊私聊等控件,在客户端线程类中封装了Socket网络编程内容,并通过相应标志位与服务器端交流,来实现昵称相同,在线人数,关闭客户端,公聊私聊等的功能和显示。2.3详细代码(带有详细注解)(1)========================服务器端===========================importjava.net.*;importjava.io.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;publicclassServerWYF//服务器主类{publicstaticvoidmain(Stringargs[]){newServerFrame();}}classServerFrameextendsJFrame//主界面类implementsActionListener{ServerPanelsp=newServerPanel(this);//容器类JListjl_user_list=newJList();//列表JSplitPanejsp=newJSplitPane(JSplitPane.VERTICAL_SPLIT,sp,jl_user_list);//分隔ServerThreadst;publicServerFrame(){super(聊天室--服务器);//标题//Containerc=this.getContentPane();//获取容器//c.setLayout(newGridLayout(1,1));//布局方式this.setLayout(newGridLayout(1,1));//设置布局方式this.add(jsp);//增加jsp//c.add(jsp);jsp.setDividerLocation(60);//分割线位置jsp.setDividerSize(0);//分割线大小this.setBounds(100,100,600,400);//窗体在屏幕位置this.setVisible(true);//确定显示窗体this.addWindowListener(//窗体监听newWindowAdapter(){publicvoidwindowClosing(WindowEvente){try{Vectorv=st.sa_list;intsize=v.size();for(inti=0;isize;i++){ServerAgenttempsa=(ServerAgent)v.elementAt(i);tempsa.dout.writeUTF(#SERVER_DOWN#);tempsa.din.close();tempsa.dout.close();tempsa.sc.close();tempsa.flag=false;}st.flag=false;st.ss.close();st=null;jl_user_list.setListData(newVector());setServerStatus(false);//设置窗口控件的可编辑性(方法)}catch(Exceptioneq){}System.exit(0);//退出程序}});this.setServerStatus(false);//窗体编辑控件是否可编辑(方法)}publicvoidsetServerStatus(booleanb)//窗体编辑控件是否可编辑(方法){//true--start//false--downthis.sp.jt_port.setEnabled(!b);this.sp.jb_start.setEnabled(!b);this.sp.jb_down.setEnabled(b);}publicvoidactionPerformed(ActionEvente)//button键的监听方法{//按下启动按钮if(e.getSource()==this.sp.jb_start){try{inttempport=Integer.parseInt(this.sp.jt_port.getText().trim());//获取端口号if(tempport65535)//判断端口号范围{newMSGDialog(this,端口范围越界!,提示);//自定义的错误提示对话框return;}this.setServerStatus(true);//窗体编辑控件是否可编辑(方法)st=newServerThread(this,tempport);//创建线程对象并启动线程st.start();}catch(NumberFormatExceptionqe){newMSGDialog(this,数据格式错!,提示);}}//按下关闭按钮,功能与窗口关闭按钮基本相同if(e.getSource()==this.sp.jb_down){try{Vectorv=this.st.sa_list;intsize=v.size();for(inti=0;isize;i++){ServerAgenttempsa=(ServerAgent)v.elementAt(i);tempsa.dout.writeUTF(#SERVER_DOWN#);tempsa.din.close();tempsa.dout.close();tempsa.sc.close();tempsa.flag=false;}this.st.flag=false;this.st.ss.close();st=null;this.jl_user_list.setListData(newVector());this.setServerStatus(false);//窗体编辑控件是否可编辑(方法)}catch(Exceptioneq){}}}}classServerPanelextendsJPanel//容器类{JLabeljl_port=newJLabel(端口号);//端口号标签JTextFieldjt_port=newJTextField(9999);//端口号输入框,初始值为9999,也可自行输入JButtonjb_start=newJButton(启动);//启动和关闭按钮JButtonjb_down=newJButton(关闭);ServerFramesf;//声明主界面类publicServerPanel(ServerFramesf){this.sf=sf;this.setLayout(null);//设置面板的布局为空jl_port.setBounds(10,20,60,20);//自定义各个控件的位置======start=======this.add(jl_port);jt_port.setBounds(70,20,60,20);this.add(jt_port);jb_start.setBounds(140,20,60,20);jb_start.addActionListener(this.sf);this.add(jb_start);jb_down.setBounds(210,20,60,20);jb_down.addActionListener(this.sf);this.add(jb_down);//==============end===============}}classServerThreadextendsThread//进程类{ServerFramesf;ServerSocketss;//服务器套接字booleanflag=true;//控制运行状态intport;//端口号Vectorsa_list=newVector();//集合框架publicServerThread(ServerFramesf,intport){this.sf=sf;this.port=port;}publicvoidrun(){try{try{ss=newServerSocket(port);//监听端口号System.out.println(lisiteningon+port+...);//提示成功监听了端口}catch(Exceptione){newMSGDialog(sf,端口错误!,提示);sf.setServerStatus
本文标题:基于Socket的网络聊天系统开发与设计
链接地址:https://www.777doc.com/doc-6022892 .html