基于JAVA聊天室的设计与开发 15
5.3服务器连接的实现
我们知道,客户程序和服务器程序是通过TCP的方式通讯的,我们从服务器的角度出发,知道其需要完成多种操作,所以在实现时,客户端在使用TCP与服务器建立了联系之后,会首先发送一标记,服务器通过识别该标记( 利用if 语句) 来继续完成相应的操作。用户添加好友: 客户登录,按查找按钮后,开始向服务器发出查找请求,服务器读取消息 并向客户返回其结果,客户收到后在查找窗口中显示,如果用户选择了一个好友,就向服务器发送添加好友请求,服务器收到后就向数据库表friend 中添加自己的号码以及好友的号码,并从cmp 表中读取其基本信息返回给客户端,然后客户收到并在主窗口显示该好友。并且通过UDP 通知该客户,对方收到该消息后,可以选择是否添加该用户为好友。用户删除好友: 用户在其好友列表中选择要删除的好友并按删除,然后向服务器发送删除请求,服务器收到该请求后,连接数据库表friend 删除用户及该好友的记录,如果成功就向客户返回成功消息,客户收到后在其好友列表中删除该好友。
服务器连接是在ConnectServer()函数中实现的,此函数用到了具有连续性、有序性特点的流,根据服务器的IP地址和端口来完成客户端与服务器端的连接。IP地址是网络中的唯一的地址标识。
5.4消息通信的实现
本系统通信方式是采用数据报服务实现的,创建数据报的连接实现步骤是:首先创建一个发送连接,这是一个数据报式的连接;然后再创建一个接受连接,当然也是一个数据报式的连接;最后输入连接的端口信息。 (1)发送消息
用户通过在好友列表中找到好友的IP地址,利用UDP协议与其他用户进行信息交流。消息发送之前首先创建一个数据报文包,用来实现无连接的包传送服务,每个数据报文包是用DategramPacket类来创建的,DategramPacket对象封装数据报包数据、包长度、目标地址和目标端口。若客户端发送数据报文包则构造函数创建DategramPacket对象,将需要发送的数据和包文目的地址信息放入对象之中。
在发送的过程中利用构造函数DategramPacket构造一个包长度为length的包,它是一个将数据传送到指定主机指定端口号上的数据文包,参数length必须小于等于bufferedarry.length。消息发送是通过调用DategramSocket对象的send方法实现的,它需要以DategramPacket对象为参数,将刚才封装进DategramPacket对象中的数据组成数据报发送出去的。
鼠标事件相应函数是属于发送消息菜单,当点击发送消息菜单时,执行这个函数,并创建一个发送消息的窗口。
通过void sendmessage_mousePressed(MouseEvent e)来创建鼠标监听事件。
16 5系统的实现
(2)监听好友消息
首先用run()启用一线程,再将此线程无限监听好友的消息,无限监听在监听好友消息中定义一个空数组,该数组用于接受消息中的数据;然后创建数据报,使用receive Socket.receive(receivePacket)函数等待并接受数据报,用byte[]date= receive Packet.getDate()函数来取得数据报中的数据。 (3)接受消息
Dategrampacket类提供了四个函数来获取消息:
Public byte[] getDate():返回一个字节数,包含收到或要发送的数据报中的数据。 Public int getLength():返回发送或接受消息的长度。
Publilc InetAddress getAddress():返回一个发送或接受此数据报报文的机器的IP地址。
Public int getPort():返回发送或接受数据报的远程主机的端口号。
为了接受从服务器返回的结果数据报文包而创建一个新的DategramPacket对象。该对象利用了DategramPacket类的一种构造方式DategramPacket这种构造方式只需要指明存放接受的数据报的缓冲区的长度。系统可调用DategramPacket对象的receive()函数来接受数据报,并将DategramPacket对象作为该函数的参数。receive()方法会一直阻塞直至受到一个数据报报文,而该函数存放在DategramPacket对象的缓冲区中。数据报文包还包含了发送者的IP地址和端口号等信息。
基于JAVA聊天室的设计与开发 17
6详细设计
本系统采用C/S设计模式,系统分为客户端和服务器端,客户端包括注册模块、登入模块、公聊模块、私聊模块、功能设置模块、和客户端功能实现模块等。服务器端包括服务器界面,服务器功能实现模块等。
6.1客户端注册
6.1.1功能描述
用户必须填写注册给定的全部选项,并且按照正确的格式输入,如年龄一项只能输入数字,的格式等等,并可以在申请注册前验证输入的用户名是否已被使用。 6.1.2综合设计
通过注册模块实现用户的在线注册,所填写的注册项目有:用户名、密码、密码确认、性别、年龄、E-mail,注册活动流程图如图6-1。
注册成功 注册界面 用户 正确填写注册项 提交 图6-1注册活动流程图
注册部分是用来处理新建用户的,每一次申请新的号码都要用到它。但代码部分是做出个注册界面,然后向服务器端发送请求,连接数据库就可以。需要说一下的就是密
18 6详细设计
码显示的实现,要做成只*,来实现密码保密。只要在定义文本格式的时候使用密码型设置就可以,用JpasswordField来定义Register类结构。
功能说明:
Register类是处理用户注册的,为用户提供一个注册界面以便用户填好资料后就进行入库操作。
Register()是类的构造函数,用于初始化Register类的。
JbInit()是创建注册窗口函数,其中包括该窗口的所有内容,采用空布局方式,通过付给控件坐标来把所有控件添加到主窗口上。
MouseClick()是处理点击按钮类,用于激活按钮。
HeadPicCombobox()是头像列表类,通过HeadPicCombobox()来文件中找到数字所对应的头像。程序界面如图6-2所示。
图6-2 注册界面
本部分要进行入库操作,所以要对所输入的字符是否合理进行判断,例如输入合理,服务器就会提示注册成功,就可以直接登录或返回登陆界面。如果密码两次输入不一致,服务器就会出报错提示。如图6-3和6-4。
基于JAVA聊天室的设计与开发 19
图6-3 注册成功
图6-4 注册失败
6.2登入
6.2.1功能描述
在设置好IP和端口号的条件下,用户在登入界面输入已注册好的用户名和密码登入,通过验证后登入聊天室主界面,输入错误返回提示。登入流程如图6-5。