欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    聊天室java课程设计.doc

    • 资源ID:865461       资源大小:344.73KB        全文页数:22页
    • 资源格式: DOC        下载积分:10积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要10积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    聊天室java课程设计.doc

    1、目录1背景介绍51.1 业务背景51.2 技术背景52 需求分析62.1 功能需求分析62.2 业务对象分析92.3 验收测试要求103 系统设计113.1 系统设计113.2 详细设计13 3.21客户端设计13 3.22服务端设计164 系统实现214.2 客户端实现214.2 服务端实现225 小结251.背景介绍 1.1 业务背景随着网络社会的不断发展,具有相同兴趣的网民需要互相远程交流,既要能省钱又要能即时交互,电话太贵、email又嫌慢,所以开发一个类似QQ 的及时通讯系统就变得非常有意义了。“Happy Chat”聊天系统应运而生,它较之QQ的唯一好处是自主开发,用的放心,更适合

    2、在局域网内使用。它提供的功能远不如QQ丰富,但应具有如下功能:(1)与聊天室成员一起聊天;(2)可以与聊天室成员私聊;(3)用户注册、登录;(4)服务器监控聊天内容;(5)服务器发送通知;(6)服务器踢人;(7)保存服务器日志。(8)保存用户聊天信息。 1.2 技术背景 本系统要求使用java技术开发,使用文件保存数据,集成开发环境使用eclipse。开发者应有java程序设计语言、SWING基本GUI组件、多线程、文件使用、socket编程、使用eclipse的基本知识和技能。系统采用两层C/S体系结构,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能; S端是聊天系统的应

    3、用服务器,主要有处理用户注册、登录、用户收发信息、用户退出等功能。C端和S端是通过网络交互的,其基本原理如图1所示:图1 C/S通讯基本原理图首先服务器启动,它会建立一个专门用于接收客户端连接请求的“倾听Socket”(相当于总服务台,有固定的IP地址和端口号),然后等待客户的连接请求。当用户想聊天时,从界面输入信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket(其端口号由服务端操作系统从空闲端口中确定),专门负责

    4、与此客户端socket的通信。一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。客户方和服务方都可以通过关闭本方的socket而结束一次通讯过程。不难发现服务器需要能同时接受多个客户的请求,为了实现这一点,一般使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理(相当于一个服务员专门服务一个以IP地址和端口

    5、号唯一标识的客户)。上述方式两个聊天者之间通信必须通过服务器进行转发,聊天者多时,显然服务器是个性能瓶颈。能不能聊天者之间直接通信?当然可以,这是所谓的P2P聊天室,缺点是对聊天者缺乏集中监管的手段。也有界于二者之间的,即有一服务器,接受注册和登录,实际聊天双方通信时,仍然是直接通信,此时服务器相当于一个婚姻介绍所,只管牵线搭桥,具体谈还是聊天者自己的事。本文主要采用聊天信息通过服务器转发的方式,而且只支持一个聊天室。因为其他典型系统如电子邮件系统,FTP系统均采用类似结构,WEB服务系统本质上也是C/S系统,只不过其客户端是浏览器,采用了HTTP通信协议和HTML,所以变成了B/S结构,可以

    6、认为是C/S的一个具体应用,其机理是相似的。2. 需求分析 2.1功能需求分析系统的主要功能已在业务分析中有所介绍,在这里需要对每个功能从使用者角度作较为具体的分析。很明显,整个系统的功能可以自然地分为客户端和服务器端。以下是主要用例描述一、客户端1 . 注册(1)客户启动程序,显示出登陆界面(2)客户选择其中的注册按钮,系统显示注册界面(3)客户填写用户名、密码、确认密码、性别、年龄、电子邮件,按确定按钮(4)系统验证密码和确认密码是否相符、用户名(不能重复)、电子邮件格式、年龄(大于10小于100)(5)系统发送上述信息及“注册请求”到服务端,等待服务端返回“注册成功”消息(6)系统提示注

    7、册成功(7)系统返回登陆界面若验证失败,提示“重新输入”若服务端返回“注册失败”,提示“注册失败”若服务端返回“注册失败 用户名重名”,则提示“注册失败 用户重名”。2. 登录(1)客户启动程序,显示出登陆界面(2)客户填写用户名、密码,服务器IP地址,按登陆按钮(3)系统验证用户名、密码,不能为空、密码字符长度为6-10(4)系统发送用户名、密码及“登陆请求”到服务端,等待服务端返回“登录成功”消息(5)若成功系统显示客户端主界面(收发消息界面) 若用户名、密码验证失败,系统提示;“用户名或密码错”,重复3次若仍不能通过验证则客户端程序退出。若服务端返回“登录失败”,系统提示“用户名或密码错

    8、”。3. 发送信息(1)在客户端主界面,用户输入消息,选择是群发还是私聊,若是私聊还要选择对方用户名,按发送按钮(2)系统验证消息长度, 私聊要求目的方用户名非空。(3)系统发送信息及“接收消息请求”到服务器端,等待服务端返回“接收成功”消息(等待返回消息可省)。(4)系统提示信息已发送若发送不成功,则系统提示“发送失败”。4. 接收信息(1)客户端系统启动,进入主界面后,会显示消息接收框(2)其他客户或服务端系统本身发送消息过来,系统接收,分析确认是” 接收消息请求“,则分析提取出消息 (3) 在消息接收框逐条显示发送者姓名、发送的消息。5. 退出(1)用户请求退出,按退出按钮(2)系统确认

    9、用户退出(对话框)(3)系统发“退出请求”到服务端,等待服务端返回“退出成功”(等待返回消息可省)(4)客户端系统关闭连接,程序退出二、服务器端1. 用户注册(1)系统启动后,等待客户请求(2)客户请求到,接受请求,分析确认是“注册请求”(3)系统读取信息,分析并再次验证用户名、密码、确认密码、性别、年龄、电子邮件。(4)系统根据用户名,在已有客户记录中查询,确认没有重名(5)系统将用户名、密码、确认密码、性别、年龄、电子邮件信息保存(6)系统向客户端发送“注册成功”消息(7)系统在监控界面上写信息:xx客户名 已注册 注册时间若重名,向客户端发“注册重名”消息若注册失败,向客户端发“注册失败

    10、”消息2. 用户登录(1)系统启动后,等待客户请求(2)客户请求到,接受请求,分析确认是“登录请求”(3)系统读取信息,验证用户名、密码是否存在(4)系统验证是否已经登录(5)系统验证用户是否已超过最大用户数(6) 系统将客户加入聊天室,通知其它客户“新用户加入”(7)系统向客户端发送“登录成功”消息(8)系统在监控界面上写信息:客户名:已登录 登录时间若验证失败,向客户端发“验证失败”消息3. 发送信息(用于管理员向聊天者发送公告信息)(1)系统启动后,等待管理员请求(2)管理员在监控界面输入消息,确定发送类型(群发还是私聊),若私聊还需指定目的用户名,按发送按钮(3)系统读取信息,分析并确

    11、认是群发还是私聊(4)若是群发,则将信息发给聊天室内其它所有用户;若是私聊,则将消息发给指定的用户。(5)系统在监控界面上写信息:管理员-消息 若出现异常,提示“发送失败”。4. 接收信息(1)系统启动后,等待客户请求(2)客户请求到,接受请求,分析确认是“接收信息请求”(3)系统读取信息,分析并确认是群发还是私聊(4)若是群发,则将信息发给聊天室内其它所有用户(5)系统向客户端发送“接收成功”消息(可省)(6)系统在监控界面上写信息:xx客户名-消息 群发/私聊若出现异常,向客户端发“接收失败”消息(可省)5. 用户退出(1)系统启动后,等待客户请求(2)客户请求到,接受请求,分析确认是“用

    12、户退出请求” (3)系统从聊天室删除客户,并通知其它用户“客户退出” (4)系统向客户端发“退出成功”(可省),关闭连接。 2.2 业务对象分析从上述的分析中,运用名词法,可以发现出主要的业务对象:1. 聊天者: 属性:用户名、密码、确认密码、性别、年龄、电子邮件 行为:登录、注册 2. 聊天客户端:属性:消息、聊天者、界面行为:接收处理,发送处理、退出3. 消息属性:消息类型、消息参数行为:创建消息、获取消息类型、获取消息参数4. 服务器(相当于总服务台) 属性:IP、端口、服务监控、消息处理者 行为:监听、创建消息处理者、创建服务监控 5. 服务监控 属性:服务状态,消息,聊天者列表、界面

    13、 行为:发送服务方消息、关闭服务器6. 消息处理者(相当于服务员)属性:连接(socket)、消息行为:处理消息(登录、注册、发送、接收、退出),收发消息 2.3 验收测试要求测试环境:客户及服务器机操作系统:Window XP,内存:512M。客户端程序安装在客户机(至少2台)上,通过以太网(网速至少10M)与服务器相连。前置条件:1.注册文件已创建但为空。2.客户及服务程序安装配置正确,能正常启动运行。3.客户程序与服务程序能通过网络互通。一、初始化数据1.客户端启动,进入注册界面,输入正确的注册数据,请求注册,查看服务端,看是否正确注册。2.重复1,在另一客户端注册用户,注意不要重名。二

    14、、功能测试1.注册测试。(1)测试重名注册。进入注册界面输入重名用户名,其它正确,请求注册。(2)测试空输入,进入注册界面,直接按注册按钮。(3)测试口令的一致性,口令长度,年龄及邮箱的数据有效性(具体测试用例设计可参考需求分析及详细设计中的相关部分)。2.登录测试。(1)输入正确的口令和密码,按登录按钮(2)空输入,直接按登录按钮。(3)分别输入用户名不正确但密码正确,用户名正确但密码不正确,用户名和密码均不正确,应均不能正确登录。(4)以同一用户名重复登录一次测试(1)(3)时要查看服务端的显示3.发送接收测试。(1)进入收发界面,群发一条消息,观察其它客户是否收到消息,察看服务器有无相应

    15、显示 (2)私聊一条消息,察看指定用户是否收到消息(3)无任何输入,直接按发送。(4)退出系统,察看服务端显示,察看其它客户端是否已将该客户名删除。(5)再启动客户端,登录进入收发界面,连续群发(至少3次),连续私聊(至少3次),再连续群发,观察其它客户及服务方的显示是否正确。三、可靠性测试 1.切断一客户至服务器的网络连接,分别进行注册、登录消息,客户端应能给出提示,而不是死机或退出,在正常聊天过程中,切断一客户端网络连接,客户程序应能给出提示。再接通网路,继续发送信息,应能正常运行。至少关闭并重启程序后,应能正常收发。同时观察其它客户及服务器收发、客户列表是否正常。 2.在正常收发中,强行

    16、关闭服务器,观察各客户端的反应。客户端应给出发送异常提示,不应退出或死机。四、性能测试(可选)编制一测试程序,作为客户端,登录进系统,向服务器按指定时间间隔群发消息。可同时启动多个发送线程(模拟多个客户),同时向服务器群发消息。看在200个模拟客户(200个发送线程),每1s一个消息的情况下,服务器能否满足客户到客户传输时间小于5s的要求。也可以考虑使用JMeter压力测试工具。3.系统设计 3.1 总体设计一、系统总体结构 总体设计阶段主要是确定系统的体系结构和主要模块 ,显然系统分客户端子系统和服务器子系统。系统体系结构如图2所示:收发界面业务逻辑网络通信 聊天服务器监管界面聊天业务处理

    17、数据网络通信 访问客户B客户A客户C数据库/文件TCP/IPTCP/IPTCP/IP 图2 系统体系结构图客户端可以划分成三子层,服务端也可以划分出三个子层,客户和服务器间通信采用的是可靠的TCP协议。基本的聊天过程如下: 0. 客户端启动注册、登录后,进入收发界面,此时C/S连接已建立,C处于接收状态。 1.客户A从界面输入消息,确定群发,业务逻辑层从界面获取信息并验证后生成“消息接收请求”消息,再将消息作为参数调用网络通信层的发送函数,发送函数将消息发往服务器,然后等待服务器的消息 2.服务器收到消息,确定是客户A发来的,从消息中分析出是群发,然后从当前客户列表中取出除A以外的与每个客户(

    18、B,C)对应的socket,然后通过socket将消息转发给客户B,C。 3.服务器在监控界面上显示:客户A消息 群发 4.服务器生成“消息接收成功”消息,向客户A回发(可省)。 5.客户A收到消息,确定是“消息接收成功”消息后,在界面上显示发送成功。 6.客户B/C的通讯模块接收到消息,分析确认是“消息接收请求”,则在界面上显示:客户A-消息 群发。不向服务器发送消息收到的确认消息。消息收发的简图如下图3所示:接收接收发送3接收消息成功(可以不要)2.2接收消息请求2.1接收消息请求息客户A聊天服务器客户B客户C1接收消息请求 图3 消息收发示意图二、服务器结构 服务器端主要的模块和结构如图

    19、4所示:图4 服务器端结构图AppServer.java 为服务器端监听类,负责服务器的启动,包括启动监听端口、服务器监控界面。ServerFrame.java 为服务器监控窗体,负责监控服务器运行状态,聊天内容,发送公告,踢人Connection.java 为服务器连接处理的具体实现。WordFilter.java 语言过滤类,处理非法聊天内容的过滤。(可选)三、客户端结构客户端主要模块和结构如图5所示:图5 客户端结构图ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。Register.ja

    20、va 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。(可选)3.2 详细设计 3.2.1 客户端设计一、注册模块程序将通过Register.java用户注册界面收集用户的用户名、密码、年龄、电子邮箱等。参考界面如图6。 图6 客户端注册界面处理过程:当用户注册时,客户端的

    21、Register.java界面收集并验证了用户的注册信息后,封装成Register_Customer类然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。客户端显示结果(重名、成功、失败),并断开连接。验证要求如下:1. 验证用户名是否为空即用户名的字符长度不为0,如果验证通过,就继续下面验证,否则返回“用户名为空”错误。2. 验证密码是否为空即密码的字符长度不为0,如果验证通过,

    22、就继续下面验证,否则返回“用户密码为空”错误。3. 验证密码的一致性验证密码两次输入是否一致,如果验证通过,就继续下面验证,否则返回“密码两次输入不一致,请重新输入”错误。 4. 验证年龄是否为空即用户年龄的字符长度不为0,如果验证通过,就继续下面验证,否则返回“用户名为空错误” 5. 验证年龄的合法性即用户年龄介于10到100之间,如果验证通过,就进行继续下面验证,否则返回“用户年龄为空” 6. 验证电子邮箱的合法性即电子邮箱字符串必须有“” ,如果验证通过,就进行继续下面验证,否则返回“电子邮箱不合法”, 二、登录模块程序将通过Login.java用户登录界面收集用户的用户名、密码,如图7

    23、所示。图7 客户端登录界面 登录过程如下:当用户登录时,客户端由Login.java 界面收集并验证用户登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection 在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。如果登录成功,客户端将继续启动聊天室主界面。验证要求:1. 验证用户名是否为空即用户名的字符长度不为0,如果验证通过,就

    24、进行继续下面验证,否则返回“用户名为空”错误,2. 验证密码是否为空即密码的字符长度不为0,如果验证通过,就进行继续下面验证,否则返回“用户密码为空”错误当以上信息验证成功时,客户端将打开与服务之间的Socket连接,用对象输出流包装后将用户登录的信息发送给服务器端,并接收服务器处理完用户登录的信息。当客户端收到服务器返回的信息时,将会用信息对话框的形式告知用户是否注册成功,若成功则显示收发主界面ChatRoom,关闭Socket连接。三、 收发模块当用户登录成功后,用户的登录界面将会消失,然后创建用户聊天室窗口(如图),在界面的标题栏将会显示当前登录用户的用户名,以防止一个机器上的用户开多个

    25、帐号进入聊天室后分不清哪个窗口是哪个用户登录的,界面第一行将显示当前服务器的在线人数。位于界面正中的两个控件分别是List和TextBox用来显示当前服务器上的在线会员名单列表和公共聊天信息。位于界面下方的就是一些用于聊天的功能控件和聊天内容个性化配置控件(可选)。包括聊天对象、聊天语气、聊天内容、聊天字体、风格、大小、颜色1. 用户发送信息当用户需要发送聊天信息时,可以在在线列表中选中聊天对象或者“所有人”,选择发言的语气,和是否私聊就可以发送聊天信息了。当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装

    26、Socket的输出流将聊天信息对象发送给服务器端。2. 接收聊天信息接收用户的聊天信息是用一个单独的接收线程实现的,因为客户端必须随时接收服务器发来的消息,而读取消息的方法采用的一般是读直到有消息到来的“阻塞读”方式,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。发送和接收可以同时进行。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息显示在聊天信息界面上。收发界面如图8所示。图8 收发

    27、界面 图上的字体(个性化)、时钟、保存等是可选的功能,聊天者列表、聊天信息显示,聊天内容、私聊等是必需的。 3.2.2 服务端设计功能描述:1.接受用户注册信息并保存在一个基于文件的对象型数据库。2.能够允许注册过的用户登陆聊天界面并可以聊天。3.能够接受私聊信息并发送给特定的用户。4.服务器运行在自定义的端口上1888。5.服务器监控用户列表和用户聊天信息(私聊除外)。6.服务器踢人,发送通知(可选)。7.服务器保存日志(可选)。一、用户注册1.去数据库读数据首先创建一个File文件类,载入“user.txt”,再用对象输入流ObjectInputStream包装File文件类,将存储在“u

    28、ser.txt”得向量对象Vector中载入内存中,现在系统中的向量就是对象型数据库,存储着每条用户信息对象。2.判断是否是第一个注册用户检测内存中的数据库对象集的当前容量是否为空,如果是,将收集的注册用户信息对象添加到数据库对象集中,然后直接写入数据库,否则继续进行其他判断。3.判断用户名是否已经存在检测内存中的数据库对象集的中有没有和当前收集的注册用户名相同的记录,如果有,就退出检测,否则继续下一个检测。4.判断用户名是否为系统关键字检测当前收集的用户名是否为“所有人”,如果是,就退出检测,否则继续下一个检测。因为“所有人”这个名字会和系统发生冲突,用户发给所有人的信息将会使用“所有人”这

    29、个特殊用户名。5.用户名有效后 写入数据库当前面的验证全部都通过的时候,将用户的注册信息对象添加到用户数据库中,然后创建文件输出流,再用对象输出流包装后写入本地文件将其持久化。最后关闭对象输出流和文件输入流。6.给客户端返回信息将用户注册成功或失败的信息用打印流包装Socket以后,输出给客户端注册结果的详细信息。7.在监管界面上显示信息,如图9所示。8.关闭Socket连接当以上的程序都正常运行后,需要关闭Socket连接,否则将会浪费服务器与客户端之间的资源。二、用户登录1.去数据库读用户数据打开用户数据库文件“user.txt”,将用户数据对象集载入内存,以供下面的程序使用。2.验证用户

    30、名是否存在在对象数据库中查找是否有与登陆用户的用户名相同的记录,如果有继续验证,否则退出验证处理,返回“没有此用户”错误。3.验证用户密码是否正确如果有与登录用户的用户名相同的记录,接着判断密码是否正确。如果密码正确,继续验证,否则退出验证处理,返回“用户密码错误”。4.验证用户是否已经登录在服务器的已登录用户列表中查找是否有该用户,如果有该用户,退出验证处理返回“该用户已经登录”错误。否则继续下面的验证。5.验证是否已经超过最大登录人数检测服务器的在线人数是否已经达到限制的最大人数,如果是,退出验证处理返回“当前服务器人数已满,请稍后再试”错误。否则继续下面的验证。6.返回客户端信息如果以上

    31、验证全部正确,就返回客户端“用户登录成功”。7.在监控界面显示信息,如图9所示8.关闭Socket连接当以上的程序都正常运行后,需要关闭Socket连接,否则将会浪费服务器与 图9 服务器管理界面客户端之间的资源。三、用户退出1.接收退出信息当用户退出时,客户端将会用基于Socket的对象输出流发给服务器退出对象。2.在线列表中删除用户用户退出后应该把用户从在线列表中删除,否则用户退出用户还在在线列表中,那么该用户下次将会无法登录。3.更新在线列表用户退出后将服务器端监控界面的用户列表更新。否则用户数据将会不同步。 图10 服务器用户信息管理界面四、接收转发用户聊天信息1.接收用户聊天信息当用

    32、户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Message对象。2.过滤用户聊天内容的非法信息(可选)分析聊天信息对象的聊天内容,用语言过滤类将非法字符过滤掉。语言过滤的时候将会打开“badword.txt”文件,不允许出现的关键词将会存储在文件中,关键字之间以逗号分割。当聊天内容中出现要过滤的关键字是 将会被系统屏蔽,而聊天内容也将替换成“非法内容,系统屏蔽”。 3.返回聊天信息 然后系统从Message中提出消息类型,再根据类型将消息强制转化ChatMessage,调用ChatMeaage中方法,获取目的客户名称列表,根据目的地用户名从用户

    33、名、socket键值表中获取socket,再通过socket将Message转发到目的客户。Message定义如下:1.消息类型 接收消息请求,登录请求,登录响应,注册请求,注册响应 2.获取类型方法getTypeChatMessage继承自Message,增加如下属性:(1).目的用户名列表LogoutMsgQuitMsgAcceptMsgAcceptMsgLoginMsgLogoutMsgLogoutMsgAcceptMsgAcceptMsgLoginACKMsgRegisterACKMsgRegisterMsg客户方A服务方LoginMsg客户方X(2).用户聊天内容;相应的还有Logi

    34、nMessage、LoginACKMessage、RegisterMessage,RegisterACKMessage. LogoutMessage(客户退出)等 图11 通信协议交互图4.系统实现 4.1 客户端实现 客户端实现的关键在于接收线程的实现,部分原型参考代码如下:class ReadMessageThread extends Thread public void run() String line=;/循环读并处理消息 while(true) try line=cin.readLine(); catch(IOException ex) System.out.println(输入输

    35、出异常n); /提取消息中的消息类型 StringTokenizer st=new StringTokenizer(line,:); String keyword=st.nextToken();/根据类型处理消息 if(keyword.equalsIgnoreCase(quit) /服务方指令退出 try socket.close(); jTextArea1.append(接收到服务器同意端口信息,套节字关闭n); break; /jump out of read thread catch(Exception ex) jTextArea1.append(关闭套接字异常); /新用户加入 els

    36、e if(keyword.equalsIgnoreCase(Login) Vector imessage=new Vector(); while(st.hasMoreTokens() imessage.addElement(st.nextToken(); jList1.setListData(imessage); /接收的消息 else if(keyword.equalsIgnoreCase(AcceptMsg) String message=st.nextToken(0); message=message.substring(1); jTextArea1.append(message+n);

    37、 4.2 服务器实现服务器端的关键在于接收处理线程和监听线程,基本代码如下:/监听线程,实现多客户聊天,解决只能处理单客户问题 class ConnectSocket extends Thread Socket socket; public void run() while(true) try socket = serverSocket.accept();/接收连接,返回连接socket catch (IOException ex) jTextArea2.append(创建套接字连接错误n); if(socket!=null) try Client client=new Client(sock

    38、et);/创建客户处理线程 clients.addElement(client);/clients是Vector,存储客户对象 if(checkName(client) /在clients中判断客户是否存在 client.start();/启动处理线程 notifyRoom();/通知其它客户,有客户加入 else disconnect(client); catch(Exception ex) jTextArea2.append(信息读取错误!n); /使用客户处理线程来实现信息的读取,解决程序死锁的问题 class Client extends Thread String name; Buf

    39、feredReader in; PrintStream out; Socket socket; public Client(Socket client) this.socket=client; try in=new BufferedReader(new InputStreamReader(socket.getInputStream(); out=new PrintStream(socket.getOutputStream(); String info=in.readLine(); StringTokenizer stinfo=new StringTokenizer(info,:); Strin

    40、g head=stinfo.nextToken(); name=stinfo.nextToken(); jTextArea1.append(系统消息:+name+已经连接n); catch(IOException ex) System.out.println(创建网络输入输出流错误!); /发送方法 public void send(String msg) out.println(msg); out.flush(); /线程运行部分 public void run() String str=; while(true) try str=in.readLine();/读消息 catch(IOExc

    41、eption ex) jTextArea2.append(输入输出异常n); disconnect(this); notifyRoom(); return; /解析、处理消息 StringTokenizer st=new StringTokenizer(str,:); String keyword=st.nextToken(); if(keyword.equals(Logout)/客户退出请求 try send(Logout); notifyRoom(); this.stop(); jTextArea1.append(连接关闭); catch(Exception ex) jTextArea2.

    42、append(套接字关闭异常n); break; else if(keyword.equals(AcceptMsg)/客户消息 String command=st.nextToken(); if(command.equalsIgnoreCase(BOARD)/实现信息的群发 String message=; message=AcceptMsg:+name+:+st.nextToken(); sendClients(message); else/将信息发给某个客户 String message = AcceptMsg:+ name+:+ st.nextToken(); sendToClient(message,command); /实现群发,通知有客户加入pub


    注意事项

    本文(聊天室java课程设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922