首页 用Java实现网络聊天室

用Java实现网络聊天室

举报
开通vip

用Java实现网络聊天室用Java实现网络聊天室 目 录 用JAVA实现网络聊天室?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1 1 前言 ???????????????????????????????????????????????????????????????????????????????????????????????????...

用Java实现网络聊天室
用Java实现网络聊天室 目 录 用JAVA实现网络聊天室?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1 1 前言 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 1 2 需求分析 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 2 3 主要应用技术 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 3 3.1 客户端与服务器的通信技术 ?????????????????????????????????????????????????????????????????????????????????????????????????????????? 3 3.2 客户端之间的通信技术 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 4 4 总体设计 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 5 4.1 系统的设计模式 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 5 4.2 系统功能模块设计 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6 4.3 数据库设计 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7 4.3.1 数据库结构设计 ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7 4.3.2 创建数据 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7 5 详细设计 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 9 5.1 服务器端的设计 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 9 5.1.1 服务器端框架类的结构 ?????????????????????????????????????????????????????????????????????????????????????????????????????????? 9 5.1.2 主要 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 实现的功能说明 ???????????????????????????????????????????????????????????????????????????????????????????????????? 10 5.2 客户端的设计 ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 12 5.2.1 客户端登录模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????? 12 5.2.2 新用户注册模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????? 13 5.2.3 客户端主界面模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????? 15 5.2.4 聊天消息模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 20 5.2.5 查找用户模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 21 5.2.6 请求加友模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 23 5.2.7 查看个人资料模块设计 ???????????????????????????????????????????????????????????????????????????????????????????????????????? 24 6 结束语 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 26 致 谢 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 26 参考文献 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 27 毕业论文(设计) 用Java实现网络聊天室 摘要 介绍了Java基于TCP/IP协议的套接字Socket、ServerSocket和基于UDP协议的DatagramSocket、DatagramPacket数据报通信技术,运用这两个技术设计并实现了一个基于Java的客户机/服务器模式的网络聊天室。聊天室的服务器端使用了JDBC同SQL Server数据库连接的技术来访问数据库,实现了服务器端通过数据库对客户信息的存储、维护、管理。使用Java语言的多线程机制,实现了一个可并发访问的服务器,为多个客户提供了对服务器的并发访问。 各个客户端在基于UDP协议的数据报通信模式下,实现了即时的在线交流。 关键词 协议;套接字;数据报;线程;聊天室 The Network Chatting Room by Java Abstract The article introduces communication technology of Socket and ServerSocket based on transmission control protocol (TCP), DatagramSocket and DatagramPacket based on user datagram protocol (UDP) of Java, By this two techonlogy designes and realizes a network chatting room based on Client/ Server mode, The server of chatting room uses connection technology of JDBC to SQL Server Database to visit the database. And could store 、maintain and manage the information of the customers In order to adapt the concurrent visit to the server by many customers, with the help of multithread mechanism in Java, a concurrent visit server. has been realized. Each client in the datagram communication mode based on the UDP, has realized the immediate online communication。 Keyword protocol;Socket;UDP;thread;chatting room 1 前言 Java是一种面向对象的、多线程的、交互式的与平台无关的编程语言,Java语言功能强大,具有丰富的网络编程类库,支持Socket 编程。Java 利用其面向对象的功能封装了Socket 实现中的许多细节,能高效率地开发基于客户机/服务器模式的复杂网络应用程序,Java的应用深入到网络应用的方方面面。对Java 强大的网络通信机制进行研究, 具有很强的实用性和迫切性。 本文详细分析Java基于TCP/IP协议的套接字Socket、ServerSocket和基于UDP协议的DatagramSocket、DatagramPacket数据报通信技术,运用这两个技术设计并实现了一个基于Java的客户机/服务器模式的网络聊天室。探讨网络聊天室设计与实现的一般流程,和在设计与实现 - 1 - 毕业论文(设计) 过程中所涉及到的问题及解决方法。 2 需求分析 从时下流行的聊天软件MSN和腾讯QQ受到启示,要设计一个简单的网络聊天室,必须实 现以下9个方面的基本功能。 (1) 用户登录。用户登录时,向服务器发送登录请求,等待服务器进行登录验证。服务器在 获取用户的号码和密码后,进行验证。如果用户的密码不正确,服务器就通知用户输入的密码不 正确;如果密码正确,就告诉用户登录成功,并把其上次登录的IP和头像号码发送给用户。用户在获得服务器登录成功的消息后就初始化登录。初始化工作包括:读取好友的信息、通知加了 自己为好友且在线的用户自己上线了。加了该用户为好友的在线用户在得到其上线通知后就把该 用户的状态更新为在线,头像更新为彩色。 (2) 用户下线。用户下线时,向服务器发送下线请求,服务器获取用户的号码,在数据库中 把该用户的状态更新为不在线。由于本聊天室不支持给不在线的好友发送消息,用户还要通知加 了自己为好友在线用户自己下线了,让这些用户把该用户的状态更新为不在线,头像更新为灰色。 (3) 注册号码。用户要进入网络聊天室,必须先注册一个用户号码。用户在填好注册信息后, 向服务器发送注册请求,服务器获取用户的注册信息后,在数据库的用户信息表中插入该用户信 息,然后把注册到的号码发给该用户。 (4) 查看和修改个人信息。用户在线时,可以查看和修改自己个人资料,包括修改密码。 (5) 查找在线用户。用户可以查找当前在线的其他用户并查看这些用户的个人信息。 (6) 精确查找用户。除了可以查找当前在线的其他用户,用户还可以通过其他用户的号码来 查找该用户,在找到该用户后,可以查看该用户的资料,如果该用户在线的话,用户可以向其发 送加友请求。 (7) 添加好友。用户可以查找当前在线的其他用户,并向这些用户发送加友请求。在收到其 他用户发送的加友请求后,用户可以选择同意该用户的加友请求或者同意该用户的请求并加该用 户为好友。若用户不想加该用户为好友,可以拒绝该用户的加友请求,或者不做任何回应。 (8) 删除好友。当用户不想再与某用户成为好友关系时,可以在头像列表中删除该用户,同 时向服务器发送删除好友请求,服务器收到请求后会在数据库的用户好友表中执行删除操作。 (9) 发送聊天消息。用户可以和在线的好友发送消息,进行聊天。并且可以打开多个聊天消 息框同时和多个好友进行聊天。 - 2 - 毕业论文(设计) 3 主要应用技术 本聊天室的开发运用了TCP/IP协议、UDP协议和Java的Socket编程技术 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( ); - 3 - 毕业论文(设计) 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构造方法: - 4 - 毕业论文(设计) 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结构,可以将任务 合理分配到客户机端和服务器端,从而降低了系统的通信开销。 - 5 - 毕业论文(设计) 图3 三层C/S结构示意图 4.2 系统功能模块设计 根据需求分析的结果,系统功能模块图如图4所示。 图4 系统功能模块 - 6 - 毕业论文(设计) 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,不在线 - 7 - 毕业论文(设计) 时为上次登录时的IP)、年龄、电话号码、电子信箱、头像号码、籍贯、个人说明,其中用户号 码字段的为主键且其属性为IDENTITY,即为自动增加字段,其种子值为:392,增量为:1。用户号码列属性设置为IDENTITY,是为了在新用户注册时,自动生成一个号码。该号码即为用户 表1 用户信息表 注册到的号码。UsersInformation表各数据类型如表1所示。 列名 数据类型 可否为空 说明 UserNo int NOT NULL 用户号码 UserName varchar(20) NOT NULL 用户昵称 Password varchar (20) NOT NULL 用户密码 Sex varchar (10) NULL 性别 Status bit NULL 状态 Ip varchar(10) NULL IP地址 Age varchar(10) NULL 年龄 Phone varchar (20) NULL 电话号码 Email varchar(30) NULL 电子信箱 Pictureno int NULL 头像号码 place varchar(20) NULL 地区 Information varchar(50) NULL 个人说明 (2) FriendMessag表。FriendMessag表用来存放用户号码和其好友的号码。FriendMessag表各数据类型如表2所示。 表2 用户好友表 列名 数据类型 可否为空 说明 Userno Int NOT NULL 用户号码 FriendNo Int NOT NULL 用户好友的号码 - 8 - 毕业论文(设计) 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() { } - 9 - 毕业论文(设计) } //启动按钮的响应方法。 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表中进行查询,取出该用户号码对应的密码,如果查询返回的结 - 10 - 毕业论文(设计) 果集为空,则发送告诉客户端登录失败的信息;如果结果集不为空,则将取出的密码和用户发送 过来的密码进行比较。如果两个密码不相同就发送告诉客户密码不正确的信息;如果相同则调用 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消息类型:是用户要修改其个人信息的请求,进一步拆分消息,得到用户 - 11 - 毕业论文(设计) 的号码和要修改的内容,然后根据用户号码在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 登录框架窗口运行效果图 登录框类结构如下: - 12 - 毕业论文(设计) 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所示。 - 13 - 毕业论文(设计) 图9 注册运行效果 注册框中的头像组合框的数据模型是一个DefaultComboBoxModel 的子类HeadPicCombobox 的对象,渲染器是一个继承了JLabel并实现了ListCellRenderer接口的类HeadpicCellRenderer的对象,这些用来做为用户头像的图片放在了类文件同一 目录 工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录 下的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) { } } 主要方法的功能说明。 - 14 - 毕业论文(设计) 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 { //初始化上线的方法。 - 15 - 毕业论文(设计) 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 {} //聊天消息框类。 - 16 - 毕业论文(设计) class MessageFrame extends JFrame {} //查找用户类。 class FindUser extends JFrame {} //查找用户列表的模型类。 class FindListModel extends DefaultListModel{} //查找用户的列表渲染类。 class FindListCellRenderer extends JLabel implements ListCellRenderer{} //请求加友类。 class RequireAddFriend extends JDialog {} //精确查找的结果类。 Class AccurateResult_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端口发送数据报,通知好友自己上线了。 - 17 - 毕业论文(设计) (2)run()方法实现的功能。 首先实例化一个接收数据报文的包对象,然后接收其他用户发过来的数据包并把收到的数据 包的内容转换为字符串形式,再把字符串形式的消息内容进行拆分得到消息类型,和发送数据报 的好友的号码。然后调用DatagramPacket.类的getAddress()方法返回一个InetAddress 类对象,再调用InetAddress 类的getHostAddress()以获取发送数据包的好友的IP地址。根据消息类型进行相应的操作,具体如下: online消息类型:是好友通知自己该好友上线了的消息。得到好友上线通知后就扫描用户的 好友列表找到该好友确的头像所在的位置,把该灰色头像设置为彩色,并更新在线好友个数。 offline消息类型:是好友通知自己好友下线了的消息。得到好友下线通知后就扫描用户的好 友列表找到该好友头像所在的位置,把该彩色的头像设置为灰色,并更新在线好友个数。 requireadd消息类型:是其它在线的用户请求加自己为好友的消息,这时会显示请求加友框.。如果点击了同意并加为好友,则会扫描好友存放好友号码的向量,看是否有该好友的号码;如果 有该好友的号码,就会出现消息框提示“你已经加了该用户好友了”。 agreeadded消息类型:是自己发送了加别的用户为好友,该用户同意了自己的加友请求,会 出现消息框提示“用户xxx通过了你的身份验证”,再向服务发送加友请求信息。 refuseadded消息类型:是自己发送了加别的用户为好友,该用户拒绝了自己的加友请求, 会出现消息框提示“:用户xxx拒绝了你的加友请求”。 sendmessageto消息类型:是加了自己为好友的用户发过来的聊天消息,。扫描当前好友列表。如果没有找到号码与发消息的用户号码相同的好友,则发消息的是陌生人,出现消息框提示:“收 到阳生人的消息”;如果找到了号码与发消息的用户号码相同的好友,则发消息的是自己好友, 出现消息框提示:“收到好友的消息”。 分清楚了发送消息的是自己的好友还是陌生人发的以后,再扫描存储打开了的消息框的向量 messageframesVec,如果在向量messageframesVec中有消息框的标识用户号码成员变量的值与发 消息的用户号码相同,则给该用户发消息的消息框已经打开了, 会出现消息框提示该消息框已经 打开了。再把消息内容加入该消息框的接收消息的文本域中;如果向量messageframesVec中没有一个消息框的标识用户号码成员变量的值与发消息的用户号码相同,则给该用户发消息的消息 框没有打开,然后创建一个与该用户聊天的消息框.设置消息框的标题为“与xxx聊天中”,其中xx表示发消息的用户的昵称,并把消息内容加到消息框的接收消息的文本域中。 (3)MainClass()方法实现的功能。 - 18 - 毕业论文(设计) 首先用登录时传过来的五个参数为自己的号码、昵称、服务器的IP地址、头像号还有与服务器的连接的套接字等成员变量赋值。再调用初化界面的方法jbInit()和初始化上线的方法onlineprepare()。然后设置主界面框架的标题为用户的号码。 (4)processWindowEvent()方法实现的功能。 首先向服务器发送读取加了自己为好友的用户中在线者的IP的请求,再向这些IP的8000端口发送数据报,通知好友自己下线了。向服务发送消息告诉服务器自己下线了,关闭与服务器的Socket连接,退出程序。 (5)List_MainClass_mouseClicked()方法实现的功能。 该方法实现在列表中点击鼠标时弹出菜单。 (6)info_MassClass_actionPerformed()方法实现的功能。 首先向服务器发送的请求,然后把服务器端发过来的用户个人资料的消息拆分,从而取得个 人资料的各项数据,据此设置查看人个资料框架的各项数据,然后显示查看个人资料框。 (7)send_actionPerformed()方法实现的功能。 首先判断与当前选中的好友聊天的消息框是否已经打开,如果已经打开就会弹出消息框提示 “该消息已经打开了”,如果没有打开将创建一个聊天的消息框,并把标题标题为“与xxx聊天中”,(其中xxx是好友的昵称)然后显示发送消息框。再把该聊天消息框对象存入存储当前已经 打开了的聊天消息向量messageframesVec。本聊天室不支持给不在线的好友发送消息,如果好友不在线,打开给该好友发消息的消息框,好友IP框就会显示”该好友不在线”。给其发送消息时, 就会出现消息框提示“该用户不在线!” (8)lookinfo_actionPerformed()方法实现的功能。 首先根据当前选中的好友的号码,扫描存储好友信息的向量,找到该好友资料在向量中存储 所在的位置,然后把该位置的数据,即为该好友的资料取出设置查看好友框架的各项数据。然后 显示查看好友资料框。 (9)chatrecorder_actionPerformed()方法实现的功能。 实现打开当前工作路径下文件名为“选中的好友昵称_好友号码”.txt的文本文件。 (10)delfriend_actionPerformed()方法实现的功能。 首先从列表中删除好友,再扫描存储好友资料的向量找到该好友资料在向量中存储所在的位 置,然后删除各向量中该位置处的数据。向服务器发送删除好友请求。如果删除的好友是状态在 线,则再把记录当前在线好友个数的变量值减1,然后更新当前在线好友数和好友总数;如果删 - 19 - 毕业论文(设计) 除的好友是状态不在线,则只更新好友总数。 (11)exit_actionPerformed()方法实现的功能。 向服务器发送读取加了自己为好友的用户中在线者的IP请求,再向这些IP的8000端口发 送数据报,通知好友自己下线了。再向服务器发送消息告诉服务器自己下线了 (12)find_MainClass_actionPerformed()方法实现的功能。 首先向服务器发送查找在线用户的请求,把服务器发过来的在线用户的资料存入FindUser 类的存储找到的在线的用户资料的向量组中,然后把在线用户的昵称、性别、省份逐一添入查找 框的列表中,然后显示查找用户框架。 5.2.4 聊天消息模块设计 聊天消息框是用来发送和接收好友消息的,用户在主界面头像中选中好友后在弹出菜单的发 送消息菜单项时和收到好友或陌生人的消息这两种情况下会被创建。聊天消息框运行效果如图 11所示。 图11聊天消息框运行效果图 聊天消息框类的结构。 class MessageFrame extends JFrame { //构造方法 public MessageFrame() { } //初始化聊天消息框界面的方法 private void jbInit() throws Exception { } //关闭按钮响应方法 - 20 - 毕业论文(设计) public void close_MessageFrame_actionPerformed(ActionEvent e) { } //发送按钮响应方法 public void send_MessageFrameactionPerformed(ActionEvent e) { } } 主要方法实现功能说明。 (1)close_MessageFrame_actionPerformed()方法实现的功能。 首先把聊天消息文本框的聊天内容存储到名为“该好友昵称_该好友号码.txt”的文件中, 然后描扫存储打开了的聊天消息框的向量messageframesVec,在聊天消息框在向量messageframesVec找到该项聊天消息框,然后删除。 (2)send_MessageFrameactionPerformed()方法实现的功能。 首先判断该好友是否在线,如果不在线则出现消息框提示:"对不起,该好友不在线";如果在 线则可以给其发送消息。 5.2.5 查找用户模块设计 查找用户包括查找在线用户和精确查找用户两种。 查找在线用户。在主界面点击查找用户按钮,就会创建查找用户框,在查找用户框的列表中 会显示在线的用户列表,选中列表中的某用户点右键,弹出快捷菜单,再点查看资料就会可以查看该好友的资料,运行效果如图(12) 所示。 图12查找用户框运行效果图 查找用户类的结构。 class FindUser extends JFrame { public FindUser() { } private void jbInit() throws Exception { } - 21 - 毕业论文(设计) //精确查找按钮响应方法 public void accuratefind_actionPerformed(ActionEvent e) { } //关闭按钮响应方法 public void close_find_actionPerformed(ActionEvent e) { } //点击在线用户列表中的弹出菜单中的查看资料菜单项的响应方法 public void lookinfo_FindUser_actionPerformed(ActionEvent e) { } //点击在线用户列表中的弹出菜单中的加为好友菜单项的响应方法 public void addfriend_FindUser_actionPerformed(ActionEvent e) { } //在找到的在线用户列表中点击鼠标右键时的响应方法 public void jList1_mouseClicked(MouseEvent e) { } } 主要方法实现的功能说明。 (1)lookinfo_FindUser_actionPerformed()方法实现的功能 首先创建查看用户资料框,从存储查找到的在线用户信息的向量组中取出用户列表中选中的 用户的资料数据,用这些数据初始化查看资料框的各项内容,然后显示查看用户资料框 (2)void addfriend_FindUser_actionPerformed()方法实现的功能 扫描存储好友用户名的向量friendnoVec,看有没有与要添加为好友的用户号码相同, 如果号码相同,弹出消息框提示"您好已经加了XX为好友了",如果没有好友的号码与该用户的相同则向该用户发送加友请求。 精确查找用户,点击查找用户框上的精确查找按钮会出现精确查找框。 精确查找类的结构。 class AccurateFind extends JDialog { public AccurateFind() { } private void jbInit() throws Exception { } //精确查找按钮的响应方法 public void Ok_AccurateFriend_actionPerformed(ActionEvent e) { } //取消按钮的响应方法 public void Cance_AccurateFriend_actionPerformed(ActionEvent e) { } } - 22 - 毕业论文(设计) 主要成员方法实现的功能说明。 Ok_AccurateFriend_actionPerformed()方法实现的功能。 首先判断输入的号码是不是为空,不为空向服务器发送精确查找用户请求,然后从输入流中 读取服务器端发过来的要精确查找的用户的资料并把赋给精确查找结果类的对应好友资料的成 员变量。然后显示精确查找结果对话框。 5.2.6 请求加友模块设计 在MainClass类的run()方法中监听好友的消息,当收到好友加友请求的消息时,会出现消息 框提示:“收到加友请求”,点击确定后就会出现请求加友框。请求加友框运行效果如图13 所示。 图13请求加友框运行效果图 请求加友类的结构。 class RequireAddFriend extends JDialog { public RequireAddFriend() { } private void jbInit() throws Exception { } //同意请求并加对方为好友按钮响应方法 public void ok_RequireAdd_actionPerformed(ActionEvent e) { } //拒绝对方的加友请求 public void refuse_RuquireAdd_actionPerformed(ActionEvent e) { } //同意对方的加友请求 public void agree_RequireAdd_actionPerformed(ActionEvent e) { } public void cancel_RequireAdd_actionPerformed(ActionEvent e) { } } 主要方法实现的功能说明。 - 23 - 毕业论文(设计) ok_RequireAdd_actionPerformed()方法实现的功能 首先,从存储好友号码的向量中逐个取出好友号码和请示加友的用户号码进行比较,如果有 好友的号码和请示加友的用户的号码相同,就会出现消息框架提示已经加了该用户为好友了,如 果没有就向服务器送加友请求,然后再向好友发送同意加友请求的消息。 5.2.7 查看个人资料模块设计 查个人资料时可以对个人资料进行修改,还可以对密码进行修改。 查看和修改个人资料,点主界面框架上的个人资料按钮会出现查看个人资料框。查看个人资 料框运行效果如图14 所示。 图14个人资料框运行效果图 查看个人资料类的结构。 class lookmyself extends JFrame { public lookmyself() { } private void jbInit() throws Exception { } //修改个人资料按钮响应方法 public void modify_lookmyself_actionPerformed(ActionEvent e) { } //关闭查看资料框架按响应方法 public void close_Lookmyself_actionPerformed(ActionEvent e) { } //修改密码按钮响应方法 public void modifypassword_lookmyself_actionPerformed(ActionEvent e) { } //选择头像响应方法 - 24 - 毕业论文(设计) public void jComboBoxhead_lookmyself_actionPerformed(ActionEvent e) { } } 主要成员方法实现的功能说明。 (1)modify_lookmyself_actionPerformed()方法实现的功能 首先,获取查看个资料框上修改以后的个人资料的各项数据,再向服务器发送修改个人资料 请求,并在发送的请求消息中附上个人资料的各项数据。 (2)modifypassword_lookmyself_actionPerformed()方法实现的功能 关闭修改个人资料框,打开修改对话框。 (3)jComboBoxhead_lookmyself_actionPerformed()方法实现的功能 设置个人资料框上的头像标签为头像组合框中选中的头像。 修改密码,点击查看个人资料框架窗口上的修改密码按钮,会出现修改密码框架窗口。修改 密码框运行效果如图15所示。 图15修改密码框运行效果图 修改密码框架窗口类的结构。 class confirmmodify extends JDialog { public confirmmodify() { } private void jbInit() throws Exception { } //确定按钮响应方法 public void ok_confirmmodify_actionPerformed(ActionEvent e) { } //取消按钮响应方法 public void cancel_confirmmodify_actionPerformed(ActionEvent e) { } } - 25 - 毕业论文(设计) 主要方法实现的功能说明。 ok_confirmmodify_actionPerformed()方法实现的功能。 首先,提取旧密码,新密码和确认新密码文本框中输入的内容,如果三个密码框中有为空的, 就出现消息对话框提示:“密码不能为空,请重新输入!”;如果三个密码框中都不为空,再判断 提取的新密码和确认新密码是否相同,如果相同,就出现消息对话框提示:“两次输入的密码不 一致,请重新输入!”, 再把新密码框和确认新密码框内设置为空;如果不相同,就向服务器发 送修改密码请求。然后从输入流读取一行信息,即为服务器端发回来的修改密码的反馈消息,如 果信息的内容为:modifypasssucceed,就出现消息对话框提示:“密码已成功修改”; 如果信息 的内容为:modifypassfail,就出现消息对话框提示:“出错了!“”;如果信息的内容为:oldpassworderror,就出现消息对话框提示:“旧密码不正确!”。 6 结束语 本文用Java的Socket技术,开发了一个简单的网络聊天室,实现了一个简单的网络天室所 需的一些基本功能。可以满足用户在组建局域网后作为内部交流工具使用。 在完成本毕业设计的过程中,我遇到了很多的困难,既有专业知识上的,也有心理因素以及各个方面的影响,这些困难一方面反映了我在专业知识上的欠缺,另外一方面也反映出了作为一个 即将毕业的大学生心理素质上的不稳定,不过所幸的是在面对这些困难的时候,我并没有被吓倒, 在老师和同学们的帮助下一个个的问题都迎刃而解。 本文由于时间和作者能力问题还存在一些缺陷,特别是聊天消息框的界面上设计的过于简 单,聊天消息框中接收到的聊天消息出现汉字乱码的问题还没有很好地解决,使得系统显得不够 成熟,希望读者谅解! 致 谢 在即将结束四年大学生活之际,我首先要感谢我的父母,他们不仅在生活中给我最多的关怀 和帮助,更给予我以精神上莫大的支持和鼓励,我只有更加努力地学习和工作,才能报答他们给 我的爱与关怀。 感谢中南民族大学计算机学院的老师们,从他们身上我学到了许多宝贵的知识和做人的道 理,他们在学业上对我的悉心指导以及孜孜不倦、严谨细致的教学和科研态度,更令我受益匪浅。 - 26 - 毕业论文(设计) 感谢我的指导老师—-宋中山老师。他在我的论文研究和论文完成过程中,给予了我许多理 论和实践上的指导。 感谢各位专家和评委耐心审阅我的论文,他们提出了许多宝贵的意见和建议。 感谢所有曾经给我理解、关心与帮助的朋友们。 参考文献 [1] 宋中山,严千钧,等. Java程序设计[M]. 北京:清华大学出版社,2005,8:290-323. [2] 刘正林,周纯杰,陈笛.Java技术基础[M].武汉:华中科技大学出版社,2002,11:451-509 [3] 印旻.Java语言与面向对象程序设计[M].北京:清华大学出版社, 2004,4:249-308 [4] 张晓东,等. Java数据库高级教程[M].北京:清华大学出版社, 2005,7:53-193 [5] 叶至军. 深入Java2 自学教程 [M].北京:人民邮电出版社,2004,10:150-172 [6] 魏海萍.标准Java2类库使用手册[M].北京:电子工业出版社,2005,1:250-261 [7] 陆正中,马进德,石正贵,等.JBuilder9软件开发项目实践[M] 第2版. 北京:清华大学出版社,2005,2: 184-214 [8] Borland 公司。JBuilder 2005 编程与开发[M]. 北京: 电子工业出版社,2005,5:165-222 [9 ] Jeff Friesen.用实例学Java2[M].北京:电子工业出版社,2002,7:265-298 [10] 潘传邦,杨瑞峰,王建军. Java 实效编程百例[M].人民邮电出版社,2003,9:5-9 [11] 胡少峰,赵克,耿春霞. 一种基于Java技术的聊天室系统的设计与实现[J].电脑与信息技术, 2002,4: 36-39 [12] 刘其成,高坚,李凯里.基于java数据报通信技术的聊天室设计与实现[J]. 信息技术, 2002, 8:14-16 [13] 吴建东,黄国辉. 基于客户机服务器模式的Java通信程序的实现[J]. 计算机与现代化, 2005,10:78-79 [14] 胡多勋,王富荣,汪自云. Java网络通信机制的研究[J]. 湖南师范学院学报(自然科学版), 2001,21(3): 40-44 [15] 王荣球. 基于Socket的网上聊天室设计与实现[J]. 电脑与信息技术, 2003,3:64-66 - 27 -
本文档为【用Java实现网络聊天室】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_594886
暂无简介~
格式:doc
大小:309KB
软件:Word
页数:0
分类:
上传时间:2017-09-01
浏览量:33