网络聊天系统设计与实现.doc_第1页
网络聊天系统设计与实现.doc_第2页
网络聊天系统设计与实现.doc_第3页
网络聊天系统设计与实现.doc_第4页
网络聊天系统设计与实现.doc_第5页
免费预览已结束,剩余25页可下载查看

下载本文档

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

文档简介

江西蓝天学院本科生毕业设计(论文)(格式范例)摘 要 随着计算机网络技术的快速发展,人们的交流方式越来越多,传统的通信方式在速度和可靠性方面已经很难满足人们的需要,即时通信系统已成为人们的新宠。同时,即时通信系统对现代企业也有着重大意义,它为诸企业开拓了网络应用的新领域。自从它诞生以来,以实时交互、资费低廉等优点,受到广大个人用户的喜爱,已经成为网络生活中不可或缺的一部分。本着学以致用的原则,本人开发了这套多点聊天系统,以满足网络用户的通讯需求。该系统具有操作简单、界面友好、功能专一等特点。本论文就系统的开发过程做了详细的介绍,并对系统的原理、总体设计等方面做了深入细致的讨论。 关键词: 聊天系统;网络通信;网络编程江西蓝天学院本科生毕业设计(论文)(格式范例)Abstract With the rapid development of Internet technology, patterns of communication for people are diversifying. The speed and reliability of modern life.Instant messaging is developing into peoples new favour ate , new field of Internet application for companies. It has been popular low expense , since it came into being , for cohich it has been an indispensable part of modern life. For the purpose of applying What have been taught ,I develop the chatting system being aimed at met the communication need of Internet users.This system contains qualities such as uncomplicated operation, friendly interface ,specilized function.This thesis makes a detailed introduction in regard to system-developing and and deeply discusses the theory of system geneval design.Keywords:Chat system; network communication; network programming江西蓝天学院本科生毕业设计(论文)(格式范例)目 录第一章 引言11.1 课题背景11.2 课题目的和意义11.3 本系统在国内外的发展概况11.3.1 聊天室的市场结构11.3.2 聊天室的商业潜质1第二章 需求分析3 2.1 需求分析3第三章 主要应用技术93.1 客户端与服务器的通信技术93.2 客户端之间的通信技术9第四章 总体设计204.1 系统的设计模式204.2 系统功能模块设计204.3 数据库设计214.3.1 数据库结构设计74.3.2创建数据表3第五章 详细设计245.1 服务器端的设计95.1.1 服务器端框架类的结构95.1.2 主要方法实现的功能说明105.2 客户端的设计125.2.1 客户端登录模块设计125.2.2 新用户注册模块设计135.2.3 客户端主界面模块设计155.2.4 聊天消息模块设计205.2.5 查找用户模块设计215.2.6 请求加友模块设计235.2.7 查看个人资料模块设计24第6章 结论与展望276.1 结论276.2进一步深入发展27致 谢31参 考 文 献32江西蓝天学院本科生毕业设计(论文)(格式范例)第1章 引言1.1 课题背景新的时代,新的世纪,在当今这个发达的信息时代,网上办公,极为普遍,生活变的简单化,人们在家就可以办公,是信息化时代的标志.我经过多方的调查和研究,并灵活运用了自己所学的知识,编写了这个非常适用的一个小软件.它是通过RMI通信协议,利用JAVA的多线程技术,将服务器和客户端达成通信的.它通过TCP/IP将服务器和客户端连接到INTERNET中,并且进行相互通信,访问,控制.JAVA的多线程技术在这里发挥了很好的作用,它可以使服务器同时连接我个客户端.RMI协议可以使服务和客户端在复杂的INTERNET中准确的进行通信. 在这个高速信息的时代,商家们纷纷把信息、产品做到Internet国际互连网页上。再这些不寻常网页的背后,要属功能齐全、安全可靠的编程语言,Java是当之无愧的。Java是由Sun Microsystem开发的一种功能强大的新型程序设计语言。是与平台无关的编程语言。Java自问世以后,以其编程简单、代码高效、可移植性强,很快受到了广大计算机编程人士的青睐。Java语言是Internet上具有革命性的编程语言,它具有强大的动画、多媒体和交互功能,他使World Web进入了一个全新的时代。Java语言与C+极为类似,可用它来创建安全的、可移植的、多线程的交互式程序。另外用Java开发出来的程序与平台无关,可在多种平台上运行。后台开发,是一种高效、实用的编程方法。人们在屏幕前只能看到例如图案、计算的结果等。实际上操作系统往往在后台来调度一些事件、管理程序的流向等。1.2 课题目的和意义聊天室可以建立在即时通讯软件(如MSN Messenger、QQ)、P2P软件、万维网等基础上,万维网方式更为普通和种类繁多,交谈的手段不局限于文本,更包括语音、视频。通常聊天室是按照房间或频道为单位的,由一个或者多个管理员管理,在同一房间或频道的网人可以实时地广播和阅读公开消息。一般情况下,与其它网络论坛、即时通讯不同的是,聊天室不保存聊天记录。 1.3 本系统在国内外的发展概况 1.3.1 聊天室的市场结构目前, 多数网站拥有一个甚至几个属于自己的聊天室。其基本运作方式为网上提供一个供访问者可以相互交流的界面,访问者通常需要先在网站登记,然后以登记的名字和密码进入聊天的界面,在这个界面下,访问者与他人可通过键盘输入文字或符号来表述各自的意义,从而达成相互沟通。由于技术含量不高, 对启动资金要求较低, 政策较宽松, 所以聊天室的进入壁垒比较低, 私人也可以有自己的聊天室。现阶段中国的聊天室市场集中度不高, 大型商业网站的聊天室和专业的聊天室网站整体占有大部分市场, 但彼此之间并没有形成绝对优势。1.3.2 聊天室的商业潜质 目前经营商获得收益的渠道有两条: 在线广告和电子商务。青少年在经济上没自立, 经营商通常很难通过电子商务获得收入; 而在在线广告方面, 各商业网站目前的广告客户主要目标人群锁定中、高收入的白领阶层, 面向青少年消费市场的网上广告几乎没有, 无法通过网上广告获得收益。因此, 对于青少年聚集的网上聊天室, 网络公司自然没有太高的热情。实际上, 青少年的消费市场一向是规模可观、利润丰厚的一块大蛋糕。无论流行音乐、新潮服饰、娱乐场所, 青少年消费都是其中的主力。聊天室的主要发展趋势是大型化和专业化, 目前比较有效的途径, 一是向实用性方向发展, 将聊天室互动的技术特性充分发挥, 满足远程交流需要。提供受众需要的内容, 例如进入在线学习领域、专家在线辅导、聊友之间进行讨论, 在这种模式下, 对用户收费就是理所当然的事情; 另一途径是走高度娱乐化道路, 让游戏规则决定一切。情景聊天室及视频聊天走的是大众化道路, 商业潜力很大。第2章 需求分析2.1需求分析从时下流行的聊天软件MSN和腾讯QQ受到启示,要设计一个简单的网络聊天室,必须实现以下9个方面的基本功能。(1) 用户登录。用户登录时,向服务器发送登录请求,等待服务器进行登录验证。服务器在获取用户的号码和密码后,进行验证。如果用户的密码不正确,服务器就通知用户输入的密码不正确;如果密码正确,就告诉用户登录成功,并把其上次登录的IP和头像号码发送给用户。用户在获得服务器登录成功的消息后就初始化登录。初始化工作包括:读取好友的信息、通知加了自己为好友且在线的用户自己上线了。加了该用户为好友的在线用户在得到其上线通知后就把该用户的状态更新为在线,头像更新为彩色。(2) 用户下线。用户下线时,向服务器发送下线请求,服务器获取用户的号码,在数据库中把该用户的状态更新为不在线。由于本聊天室不支持给不在线的好友发送消息,用户还要通知加了自己为好友在线用户自己下线了,让这些用户把该用户的状态更新为不在线,头像更新为灰色。(3) 注册号码。用户要进入网络聊天室,必须先注册一个用户号码。用户在填好注册信息后,向服务器发送注册请求,服务器获取用户的注册信息后,在数据库的用户信息表中插入该用户信息,然后把注册到的号码发给该用户。(4) 查看和修改个人信息。用户在线时,可以查看和修改自己个人资料,包括修改密码。(5) 查找在线用户。用户可以查找当前在线的其他用户并查看这些用户的个人信息。(6) 精确查找用户。除了可以查找当前在线的其他用户,用户还可以通过其他用户的号码来查找该用户,在找到该用户后,可以查看该用户的资料,如果该用户在线的话,用户可以向其发送加友请求。(7) 添加好友。用户可以查找当前在线的其他用户,并向这些用户发送加友请求。在收到其他用户发送的加友请求后,用户可以选择同意该用户的加友请求或者同意该用户的请求并加该用户为好友。若用户不想加该用户为好友,可以拒绝该用户的加友请求,或者不做任何回应。(8) 删除好友。当用户不想再与某用户成为好友关系时,可以在头像列表中删除该用户,同时向服务器发送删除好友请求,服务器收到请求后会在数据库的用户好友表中执行删除操作。(9) 发送聊天消息。用户可以和在线的好友发送消息,进行聊天。并且可以打开多个聊天消息框同时和多个好友进行聊天。第3章 主要应用技术3.1 客户端与服务器的通信技术客户端与服务器是基于TCP/IP协议建立连接,进行数据传输的,其流程图如图1所示。 TCP/IP协议是一种基于连接的协议,它在两台计算机之间提供了一个可靠的数据流。TCP/IP协议通过信息校验能够保证接收方所接收到的数据和发送方所发送的数据在内容和顺序上是完全一致的,从而实现数据的可靠传输。要求一个可靠的、点到点通道进行通信的应用程序,应该使用TCP/IP协议进行通信。图1 基于TCP/IP协议建立连接,进行数据传输的流程图在Java的基于TCP/IP协议的Socket通信模式中,服务器端使用ServerSocket 类,客户端使用Socket 类。(1) ServerSocket类的构造方法:ServerSocket (int prot);ServerSocket (int prot,int count);(2) ServerSocket类的常用的方法:public Socket accept ( );public void close ( );public InetAddress getInetAddress( );public int getLocalPort ( );(3) Socket类的构造方法:Socket (InetAddress address,int prot );Socket (InetAddress address,int port,boolean stream);(4) Socket 类的常用的方法:public void colse ( );public InetAddress getInetAddress( );public int getLocalPort ( );public InputStream getInputStream ( );public OutputStream getOutputStream ( );3.2 客户端之间的通信技术两个用户进行聊天时,使用的基于UDP协议的数据报通信模式, UDP不是一种基于连接的协议,它为两台计算机提供一种非可靠的无连接投递报文的通信服务,由于UDP协议不建立连接,所以不能保证接受方能够接收到该数据包,甚至不能确保接收方所接收到的数据和发送方所发送的数据内和顺序上是完全一致的,但是它的通信速度比较快,所以数据报服务一般用于传送非关键性的数据。在两个用户聊天期间一般对数据的可靠性要求不高,所以使用UDP协议。基于UDP协议的数据报通信流程图如图2所示。图2 基于UDP协议的数据报通信流程图Java提供两个类DatagramPacket和Datagram Socket来支持数据报编程。其中类DatagramPacket表示数据报,而类Datagram Socket表示发送和接收数据报的Socket。(1) DatagramSocket构造方法:public DatagramSocket ( ) throws SocketException;public DatagramSocket (int port) throws SocketException;(2) DatagramSocket 类的常用方法:public void receive (DatagramPacket dp) throws IOException;public void send (DatagramPacket dp ) throws IOException;public void close ();(3) DatagramPacket类构造方法:public DatagramPacket (byte buf,int length);public DatagramPacket ( byte buf,int length,InetAddress address,int port);(4) DatagramPacket类常用方法:public InetAddress getAddress();public int getPort ();public int getLength();public byte getData ();public void setData (byte buf);第4章 总体设计4.1系统的设计模式本聊天室采用客户机/服务器(C/S)模式来设计,是一个三层的C/S结构,即:数据库服务器/应用程序服务器端/应用程序客户端,其分层结构如图3所示。系统采用C/S结构,可以将任务合理分配到客户机端和服务器端,从而降低了系统的通信开销。图3 三层C/S结构示意图44.2系统功能模块设计根据需求分析的结果,系统功能模块图如图4所示。图4 系统功能模块4.3数据库设计4.3.1数据库结构设计根据系统功能模块设计的结果,本网络聊天室的数据库的操作对象有正在注册的用户和登录在线的用户。因此在数据库中要记录用户的个人资料数据,和用户好友数据,由于一个用户的资料只能有一个而该用户的好友却可以有多个,因此用户与好友的联系如图5所示。图5 用户与好友的联系由图5可见,要用两个表分别进行数据记录,需要以下两个数据实体。(1) 用户个人信息数据实体:该实体记录用户的个人信息,包括用户号码、用户昵称、性别、年龄、状态、IP地址、电话号码、电子信箱、头像号码、省份、个人说明。(2) 用户好友数据实体:该实体记录用户的好友号码。用户实体E-R图如图6所示。图6 用户实体及属性4.3.2创建数据表在SQL Server 2000上新建名为gt02chat的数据库,并在该数据库上建立存放用户的个人资料信息的表UsersInformation,和存放用户的好友信息的表FriendMessag。(1) UsersInformation表。UsersInformation表存放用户的个人资料信息,包括用户的号码、昵称、密码、性别、状态(用户在线时为1,离线为0)、IP地址(用户在线时为用户当前IP,不在线时为上次登录时的IP)、年龄、电话号码、电子信箱、头像号码、籍贯、个人说明,其中用户号码字段的为主键且其属性为IDENTITY,即为自动增加字段,其种子值为:392,增量为:1。用户号码列属性设置为IDENTITY,是为了在新用户注册时,自动生成一个号码。该号码即为用户注册到的号码。UsersInformation表各数据类型如表1所示。表1 用户信息表列名数据类型可否为空说明UserNointNOT NULL用户号码UserNamevarchar(20)NOT NULL用户昵称Passwordvarchar (20)NOT NULL用户密码Sexvarchar (10)NULL性别StatusbitNULL状态Ipvarchar(10)NULLIP地址Agevarchar(10)NULL年龄Phonevarchar (20)NULL电话号码Emailvarchar(30)NULL电子信箱PicturenointNULL头像号码placevarchar(20)NULL地区Informationvarchar(50)NULL个人说明(2) FriendMessag表。FriendMessag表用来存放用户号码和其好友的号码。FriendMessag表各数据类型如表2所示。表2 用户好友表列名数据类型可否为空说明UsernoIntNOT NULL用户号码FriendNoIntNOT NULL用户好友的号码 第5章 详细设计 5.1 服务器端的设计服务器端完成了三大功能:与客户建立端连接、监听客户端消息、操作数据库。由于会同时有多个用户访问服务器,为适应多个客户的并发访问。本聊天室服务器端程序借助于Java语言的多线程机制,实现了一个可并发访问的服务器,具体实现为:每当在内部类listen中创建一个新的套接字连接时(即成功调用了accept() 方法),会启动一个新的Client线程来负责本服务器和该客户之间的连接,并在的Client线程的run()方法中处理客户的请求,主程序将返回并等待下一个连接请求。前一线程在完成相应的交互过程中自动退出, 连接也将自动关闭。服务器运行效果如图7所示。图7 服务器端运行效果图5.1.1 服务器端框架类的结构class Frame1 extends JFrame /服务器框架类Frame1构造方法public Frame1() /内部类Client。class Client extends Thread public Client(Socket s) public void run() /启动按钮的响应方法。 public void link_actionPerformed(ActionEvent e) /退出按钮响应方法public void sysexit_actionPerformed(ActionEvent e) /内部类listen,用来监听客户连接请求。class listen extends Thread public void run( ) 5.1.2 主要方法实现的功能说明link_actionPerformed( )方法实现的功能。点击启动按钮后,初始化服务器套接字,在端口8080进行监听,并在框架上的文本域中显示:“系统提示: 聊天服务器 系统启动”。然后创建一个listen线程,用来等待客户端连接请求。如果捕捉到异常,则在框架上的文本域中提示连接失败,并显示异常的内容。再次点击启动按钮时,则在文本框显示“系统消息: 聊天室服务器 已经启动”内部类listen 的run()方法实现的功能。首先调用ServerSoket的accept()方法,等待客户端连接请求,当有用户连接后,listen线程将返回已建立连接的套接字。如果捕捉异常,则在文本域中提示连接失败,并显示异常的内容。如果没有异常产生,则创建一个Client线程,每创建一个Client线程对象就对应一个新的客户连接。再把返回的连接套接字作为实参传给Client线程,然后启动Client线程。内部类Client的构造方法 Client(Socket s)。调用Socket类的getInputStream() 方法获得输入流,再调用Socket 的getOutputStream() 方法获得输出流,在此基础上,再创建与用户端通信的输入流和输出流对象,为与客户端的通信做准备。内部类Client的run()方法实现的功能。首先从输入流中获取一行信息,然后拆分获得消息类型,根据消息类型来调用相应的方法,对数据库进行操作,并把结果发送给客户端。各种消息类型详细说明如下:(1) login消息类型:是用户发送的登录请求,进一步拆分消息,得到用户发送过来的号码和密码,然后在UsersInformation表中进行查询,取出该用户号码对应的密码,如果查询返回的结果集为空,则发送告诉客户端登录失败的信息;如果结果集不为空,则将取出的密码和用户发送过来的密码进行比较。如果两个密码不相同就发送告诉客户密码不正确的信息;如果相同则调用Socket类的getInetAddress()方法以获取客户端的IP地址,再把UsersInformation表中该用户的IP列更新为其当前登录的IP,Status列更新为1(表明该用户在线),再发送告诉该用户登录成功的消息并附上用户上次登录的IP,用户的昵称和用户的头像号码, 最后把连接的用户数更新。(2) register消息类型:是用户发送的注册号码请求,进一步拆分消息,会逐一得到用户相关的注册信息,把这些信息插入数据库的用户信息表中,再根据用户昵称和密码进行查询从用户信息表中取出对应的用户号码,即为用户注册的号码,如果成功查询到号码,则把注册到的号码发送给客户,否则发送告诉客户端注册失败的消息。(3) readfriendmessage消息类型:是用户在验证身份登录成功后发送的获取其在线好友信息的请求,进一步拆分消息,将得到用户号码,然后根据用户号码在FriendMessage表中查询其好友,把查询得到的好友号码存入一个数组,再用循环语句从数组逐个取出这些号码,在UsersInformation表查询,逐一得到的每一个号码对应的用户的信息发送给用户。(4) getaddmeusersip消息类型:是用户在验证身份登录成功或退出聊天的时候为了通知加了该用户为好友的用户,要从服务器端取得这些用户中在线者的IP的请求。 进一步拆分消息,得到用户号码, 然后根据用户号码在FriendMessage表中查询加了其为好友的用户的号码,将查询得到的用户号码存入一个数组,再用循环语句从数组逐个取出这些号码,在UsersInformation表查询,逐一获得这些用户中在线者的IP发送给用户。(5) lookmyinfo消息类型:是用户发送的查看自己注册的资料的请求, 进一步拆分消息,得到用户号码, 然后根据用户号码在UsersInformation表查询,得到用户的信息,发送给用户。(6) findonline消息类型:是用户要查找其它在线用户的请求,将在UsersInformation表查询获得除了该用户以外的所有在线的用户,再把这些信息发给用户。(7) accuratefind消息类型:是用户要精确查找某号码对应的用户的信息,进一步拆分消息,得到要精确查找的用户号码,然后在UsersInformation表查询该号码的信息并发送给用户。(8) addfriend消息类型是:是用户要添加某用户为好友的请求, 进一步拆分消息,得到用户要添加其为好友的用户的号码和该用户的号码,然后把信息插入FriendMessage表中。(9) delfriend消息类型:是用户要删除其某位好友的请求,进一步拆分消息,得到用户要删除的好友的号码和该用户的号码,然后在FriendMessage表中执行删除操作。(10) modifymyinfo消息类型:是用户要修改其个人信息的请求,进一步拆分消息,得到用户的号码和要修改的内容,然后根据用户号码在UsersInformation表中更新该号码对应的其它列。(11) modifypassword消息类型:是用户要候改密码的请求, 进一步拆分消息,得到用户的号码和要修改的内容, 然后根据用户号码在UsersInformation表更新该号码对应的密码。(12) logout消息类型:是要退出聊天的消息,进一步拆分消息,将得到用户的号码,然后在UsersInformation表更新该号码对应的状态为0,再把连接用户数更新,最后关闭与该用户的连接。服务器端每获取一条消息,判断出消息类型后都会对数据进行操作,对数据库进行操作时,首先要连接数据库,连接数据库是使用的JDBC同SQL Server数据库连接的技术,具体如下。String url = jdbc:microsoft:sqlserver:/localhost:2550;DatabaseName=gt02chat;Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);Connection c=DriverManager.getConnection(url,sa,02071392); 在对数据库进行查询,插入和更新操作时,使用的是预备语句PreparedStatement,每一个 PreparedStatement对象代表一个预编译的语句,包含于PreparedStatement对象中的语句可具有一个或多个IN参数, IN参数的值在语句创建时末被指定,该语句为每个IN参数保留一个“?”作为占位符。每个问号的值必须在该语句执行之前,通过通过其setXXX方法来提供。以上那些对数据库的操作,所需要的数据都是要先从输入流中客户端发过来的信息中获取。然后作为参数用来提供给PreparedStatement语句,才能执行数据库操作。5.2 客户端的设计5.2.1 客户端登录模块设计用户输入已经注册到的号码、设置的密码和服务器的IP地址,按下回车或登录按钮就可以向服务器发送登录请求。登录框运行效果如图8所示。图8 登录框架窗口运行效果图登录框类结构如下:class UserLogin extends JFrame public UserLogin() private void jbInit() throws Exception /“注册”按钮响应方法。 public void register_Login_actionPerformed(ActionEvent e) /“登录”按钮的响应方法。 public void login_Login_actionPerformed(ActionEvent e) /在服务器IP文本框中按下“回车”时的响应方法。 public void serveiprField_Login_actionPerformed(ActionEvent e) 主要方法实现的功能说明。(1)login_Login_actionPerformed()方法实现的功能首先判断用户号码、密码、服务器IP三个文本框是否有空的。如果有空的,则出现消息框提示“请您输入完整的信息”;如果没有空的,从服务器IP文本框中获取输入的服务器IP地址。在该IP地址的8080端口建立与服务器的连接,然后创建输入、输出流。从密码文本框中获取输入的密码加上用户的号友一起发送给服务器。然后从输入流中获取一条信息。即为服务器端发过来的登录验证的反馈消息。如果消息内容为loginfail,就出现消息框提示:“对不起,出错了!”;如果消息内容为:passworderror,就出现消息框提示:“密码不正确!”;如果消息内容为:loginsucceed, 就拆分消息得到服务发过来的用户上次登录的IP,和用户的昵称。然后打开主界面,接着出现消息框提示登录成功!并告诉用户上次登录的IP地址。(2)serveiprField_Login_actionPerformed()方法实现的功能调用login_Login_actionPerformed()方法,实现在“服务器IP”文本框按下回车按钮可以响应登录按钮。5.2.2 新用户注册模块设计户点击登录框架窗口上面的“注册号码”按钮将出现注册框,运行效果如图9所示。 图9 注册运行效果注册框中的头像组合框的数据模型是一个DefaultComboBoxModel 的子类HeadPicCombobox 的对象,渲染器是一个继承了JLabel并实现了ListCellRenderer接口的类HeadpicCellRenderer的对象,这些用来做为用户头像的图片放在了类文件同一目录下的images文件夹中,因此用到ClassLoader的静态方法getSystemResource()来加入这些用作头像的图片。注册框架类的结构。class register extends JFrame public register() private void jbInit() throws Exception / JRadioButton响应方法 public void boy_actionPerformed(ActionEvent e) / JRadioButton响应方法 public void secret_actionPerformed(ActionEvent e) / JRadioButton响应方法 public void girl_actionPerformed(ActionEvent e) /“取消”按钮响应方法 public void cancel_actionPerformed(ActionEvent e) / “确定”按钮响应方法public void ok_Register_actionPerformed(ActionEvent e) 主要方法的功能说明。ok_Register_actionPerformed()方法实现的功能。首先创建输入流和输出流,再从各个文本框中获取注册的信息发给尖服务器,依次是昵称、性别、密码、年龄、电话、电子邮箱、头像号、城市、个人说明。再从输入流中读取一行信息,如果信息内容为:false,出现消息框提示:“出错了!”。否则就出现消息框提示:“您注册到的用户号码是xxx”。最后,关闭与服务器端的连接,退出程序。5.2.3 客户端主界面模块设计用户登录,经登录验证成功后,就会关闭登录框,出现客户端主界面,接着会出现消息框提示用户上次登录的IP。客户端主界面模块是用户进入聊天室的一个通道,用户所有的操作都是通过主界面模块实现的,主界面运行效果如图10所示。图10 主界面运行效果图主界面的头像列表的数据模型是一个DefaultListModel的子类NameAndPicListModel 的对象,渲染器是一个继承了JLabel并实现ListCellRenderer接口的类NameAndPicListCellRenderer的对象,这些用来做为用户头像的图片放在了类文件同一目录下的images文件夹中,用到了ClassLoader类的静态方法SystemResource()来加入这些用作头像的图片。主界面框架类的结构。主界面模块的功能是由一个包含了一些内部类MainClass的类实现,它继承自JFrame类并实现了Runnable接口。该类的结构如下:class MainClass extends JFrame implements Runnable /初始化上线的方法。public void onlineprepare() /Runnable接口的run()方法public void run() /构造方法。public MainClass(int myselfno,String na,String serip,int picno,Socket s) /关闭主界面框架时的响应方法。protected void processWindowEvent(WindowEvent e) /在头像列表中点击鼠标的响应方法。public void List_MainClass_mouseClicked(MouseEvent e) /“个人资料”按钮的响应方法。public void info_MassClass_actionPerformed(ActionEvent e) /弹出菜单的“发送消息”菜单项的响应方法。public void send_actionPerformed(ActionEvent e) /弹出菜单的“查看资料”菜单栏的响应方法。public void lookinfo_actionPerformed(ActionEvent e) /弹出菜单的查看“聊天记录”菜单栏的响应方法。public void chatrecorder_actionPerformed(ActionEvent e) /弹出菜单的“删除好友”菜单栏的响应方法。public void delfriend_actionPerformed(ActionEvent e) /“退出聊天”按钮的响应方法。public void exit_actionPerformed(ActionEvent e) /“查找用户”按钮的响应方法。public void find_MainClass_actionPerformed(ActionEvent e) /下面是一些内部类。/精确查找类。class AccurateFind extends JDialog /查看资料类。class LookInfomation extends JFrame /聊天消息框类。class MessageFrame extends JFrame /查找用户类。class FindUser extends JFrame /查找用户列表的模型类。class FindListModel extends DefaultListModel/查找用户的列表渲染类。class FindListCellRenderer extends JLabel implements ListCellRenderer /请求加友类。class RequireAddFriend extends JDialog /精确查找的结果类。ClassAccurateResult_close_AccurateResult_actionAdapterimplements ActionListener /查看个人资料类。class lookmyself extends JFrame /修改密码类。class confirmmodify extends JDialog /主界面头像列表的数据模型.class NameAndPicListModel extends DefaultListModel /主界面类头像列表渲染.class NameAndPicListCellRenderer extends JLabel implements ListCellRenderer 主要方法所实现的功能说明。(1)onlineprepare()方法实现的功能。首先实例化一个用于发送数据报的套接字的接收数据报的套接字,创建与服务端通信的输入输出流,向服务器端发送读取好友信息的请求。然后用一个循环语句,把服务器端发过来的好友信息存入逐一存入存储好友信息的向量组。再把好友的头像加入列表中,具体为:对存放好友状态的向量friendstatusVec进行判断,在线的显示在线的彩色头像,不在线的显示灰色头像。然后设置在显示在线好友的文本框的文本内容为“当前在线好友个数online/sum” 其中online为在线好友个数,sum为好友的总数。然后向服务器发送请求,然后服务器把加了自己为好友的用户中在线者的IP发过来,再向这些IP的8000端口发送数据报,通知好友自己上线了。(2)run()方法实现的功能。首先实例化一个接收数据报文的包对象,然后接收其他用户发过来的数据包并把收到的数据包的内容转换为字符串形式,再把字符串形式的消息内容进行拆分得到消息类型,和发送数据报的好友的号码。然后调用DatagramPacket.类的getAddress()方法返回一个InetAddress 类对象,再调用InetAddress 类的getHostAddress()以获取发送数据包的好友的IP地址。根据消息类型进行相应的操作,具体如下:online消息类型:是好友通知自己该好友上线了的消息。得到好友上线通知后就扫描用户的好友列表找到该好友确的头像所在的位置,把该灰色头像设置为彩色,并更新在线好友个数。offline消息类型:是好友通知自己好友下线了的消息。得到好友下线通知后就扫描用户的好友列表找到该好友头像所在的位置,把该彩色的头像设置为灰色,并更新在线好友个数。requireadd消息类型:是其它在线的用户请求加自己为好友的消息,这时会显示请求加友框.。如果点击了同意并加为好友,则会扫描好友存放好友号码的向量,看是否有该好友的号码;如果有该好友的号码,就会出现消息框提示“你已经加了该用户好友了”。agreeadded消息类型:是自己发送了加别的用户为好友,该用户同意了自己的加友请求,会出现消息框提示“用户xxx通过了你的身份验证”,再向服务发送加友请求信息。refuseadded消息类型:是自己发送了加别的用户为好友,该用户拒绝了自己的加友请求,会出现消息框提示“:用户xxx拒绝了你的加友请求”。sendmessageto消息类型:是加了自己为好友的用户发过来的聊天消息,。扫描当前好友列表。如果没有找到号码与发消息的用户号码相同的好友,则发消息的是陌生人,出现消息框提示:“收到阳生人的消息”;如果找到了号码与发消息的用户号码相同的好友,则发消息的是自己好友, 出现消息框提示:“收到好友的消息”。分清楚了发送消息的是自己的好友还是陌生人发的以后,再扫描存储打开了的消息框的向量messageframesVec,如果在向量messageframesVec中有消息框的标识用户号码成员变量的值与发消息的用户号码相同,则给该用户发消息的消息框已经打开了, 会出现消息框提示该消息框已经打开了。再把消息内容加入该消息框的接收消息的文本域中;如果向量messageframesVec中没有一个消息框的标识用户号码成员变量的值与发消息的用户号码相同,则给该用户发消息的消息框没有打开,然后创建一个与该用户聊天的消息框.设置消息框的标题为“与xxx聊天中”,其中xx表示发消息的用户的昵称,并把消息内容加到消息框的接收消息的文本域中。(3)MainClass()方法实现的功能。首先用登录时传过来的五个参数为自己的号码、昵称、服务器的IP地址、头像号还有与服务器的连接的套接字等成员变量赋值。再调用初化界面的方法jbInit()和初始化上线的方法onlineprepare()。然后设置主界面框架的标题为用户的号码。 (4)processWindowEvent()方法实现的功能。首先向服务器发送读取加了自己为好友的用户中在线者的IP的请求,再向这些IP的8000端口发送数据报,通知好友自己下线了。向服务发送消息告诉服务器自己下线了,关闭与服务器的Socket连接,退出程序。(5)List_MainClass_mouseClicked()方法实现的功能。该方法实现在列表中点击鼠标时弹出菜单。(6)info_MassClass_actionPerformed()方法实现的功能。首先向服务器发送的请求,然后把服务器端发过来的用户个人资料的消息拆分,从而取得个人资料的各项数据,据此设置查看人个资料框架的各项数据,然后显示查看个人资料框。(7)send_actionPerformed()方法实现的功能。首先判断与当前选中的好友聊天的消息框是否已经打开,如果已经打开就会弹出消息框提示“该消息已经打开了”,如果没有打开将创建一个聊天的消息框,并把标题标题为“与xxx聊天中”,(其中xxx是好友的昵称)然后显示发送消息框。再把该聊天消息框对象存入存储当前已经打开了的聊天消息向量messageframesVec。本聊天室不支持给不在线的好友发送消息,如果好友不在线,打开给该好友发消息的消息框,好友IP框就会显示”该好友不在线”。给其

温馨提示

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

最新文档

评论

0/150

提交评论