java课程设计网络即时通信系统Word文件下载.docx
《java课程设计网络即时通信系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《java课程设计网络即时通信系统Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
Int
No
2
Nickname
用户的昵称
Char
3
Password
用户的密码
4
Status
用户在线否
Bit
5
Ip
用户的IP地址
Yes
6
Info
用户的资料
Varchar
7
Pic
用户的头像号
8
Sex
用户性别
9
Email
用户的E-mail
10
place
用户的籍贯
课程设计说明书NO.3
表2用户的好友表(表名friend)
Friend
好友的号码
2.3服务器的设计
2.3.1主服务器的设计
主服务器类实现了服务器端的多线程,即使用ServerSockets=newServerSocket(8080)语句在8080端口创建套接口;
使用newServerThread(socket)语句创建新的线程。
主服务器类调用ServerThread类,而每个ServerThread实体就是一个单独的线程,即对应于客户端连接请求响应的线程。
服务器有一个进程(或多个线程)在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。
客户端只在需要的时候向服务器端发出连接请求。
实现代码如下:
PublicclassServer{
Publicstaticvoidmain(Stringargs[])throwsIOException{
ServerSockets=newServerSocket(8080);
System.out.println(“Serverstart..”+s);
try{
while(true){
Socketsocket=s.accept();
System.out.println(“Connectinoaccept:
”+socket);
try{
newServerThread(socket);
}catch(IOExceptione){
Socket.close();
}
}finally{
s.close();
}
课程设计说明书NO.4
2.3.2ServerThread类的设计
importjava.io.*;
import.*;
importjava.sql.*;
importjava.util.Vector;
classServerThreadextendsThread{
privateSocketsocket;
privateBufferedReaderin;
privatePrintWriterout;
intno;
publicServerThread(Sockets)throwsIOException{
socket=s;
in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
start();
}
2.3.3登录验证
如果客户端输入的字符串表示需要登录,那么服务器在接受到该信息后连接数据库,准备从数据库选择昵称和密码。
服务器接收到客户端发送过来的号码和密码信息后,设定数据库查询条件,并执行数据库查询,通过比较输入的用户名和密码和数据库信息来确定用户的登录是否成功。
通知好友也是在run函数中实现的服务器功能。
服务器首先连接数据库,再根据“我的号码”从好友表中得到我的好友列表,然后利用广播通知他们我已经上线了。
实现代码:
略。
2.3.4新建用户
新建用户是网络聊天工具的一个基本功能。
用户新建过程也在线程监听函数run()中。
新建用户的过程是这样的:
首先要使用Class.forName方法加载数据库驱动类,该类的描述是sun.jdbc.odbc()dbcDriver;
然后使用DriverManager.getConnection方法
连接数据,数据库名为jdbc:
odbc:
javaicq;
最后服务器接收客户端用户发送的昵称、密码、用户E-mail、个人资料、籍贯和头像等信息,执行数据库添加操作完成用户的创建。
服务器为新建的用户制定唯一的注册号码,并将号码以即时消息的方法发送给用户。
课程设计说明书NO.5
2.3.5好友处理
a.查找好友:
当客户端向服务器端发送查找好友的请求后,服务器立即响应并调用Class.forName方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver,然后调用方法DriverManager.getConnection完成数据库的连接,得到用户好友查询的结果。
查询结果包括:
好友的昵称、性别、籍贯、个人资料等信息。
服务器对数据库的查询结果进行筛选,只向客户端的用户返回好友的注册号码、头像信息及是否在线信息。
客户端接收到查询结果后,利用效能感应的函数将其显示出来。
b.读取资料:
读取资料功能是在查找好友功能基础上建立的,用户得到好友列表后,可根据需要读取好友的详细资料,也可以读取用户自己的详细资料。
服务器使用Vector矢量保存客户端用户的好友号码,并返回好友的昵称、号码、IP地址、状态、头像和个人资料等信息。
c.添加好友:
服务器响应客户端用户的请求后,首先连接数据库,并根据接收的用户号码及好友号码向好友表添加记录。
服务器使用哪个r6保存查询结果。
若r6为1,则表明添加好友成功,服务器将给客户端发出“okaddfriend”的消息;
否则添加好友失败,服务器将给客户端发出“falseaddfriend”的消息。
d.删除好友:
当服务器接受到客户端的删除好友请求后,它连接数据库,并根据接收的用户号码及好友号码将好友表记录删除。
服务器利用r7保存删除结果,若r7为1,则删除好友成功,服务器给客户端发出“okdelfriend”的消息;
否则删除好友失败,服务器给客户端发出“falsedelfriend”的消息。
好友处理实现代码:
2.3.6退出下线
用户在线时,数据库表的IP地址字段为此时用户计算机的真实IP地址,状态字段为1.若用户退出下线,服务器只需是完成修改IP字段和状态字段即可。
服务器首先利用Class.forName方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver;
然后通过方法DriverManager.getConnection连接数据库,最后根据用户号码,将其状态字段设为0,IP地址字段为空。
2.4客户端的设计
客户通过Socket与服务器建立连接,服务器与客户都通过构造BufferedReade、PrintWriter来建立输入/输出流来相互传递信息。
一旦收到客户方的连接请求,服务器利用accept()函数返回一个新建的Socket对象,随后客户端向服务器发送消息,诸如注册、登录和查找好友等请求,服务器收到请求后,针对不同的消息处理请求。
在这一过程中,服务器端与客户端采用UDP协议通信。
虽然UDP协议不可靠,但是对于聊天工具而言,可靠性并不太重要。
课程设计说明书NO.6
2.4.1用户注册
当服务器收到用户的注册请求后,开始接收客户传递的信息,诸如客户的昵称、性别、籍贯、头像和个人资料等信息。
接收完毕后,服务器便通过JdbcOdbc与后台数据库连接,向数据库添加记录,其流程如图3所示。
若新用户注册,则向客户返回号码,并在数据库中注册用户的IP地址,设定Status值告知用户在线(Status设为1)。
客户收到服务器返回的信息后,打开主程序窗口,同时创建UDP以便在用户之间建立联系。
注册事件处理,这是处理客户端的主要部分。
Java事件包括键盘事件、鼠标事件和按钮等事件。
而所使用到的是鼠标事件实际就是点鼠标按钮时,系统会调用监听器,包括mousePressed,mouseReleased,mouseClicked。
监听及处理流程如图4所示。
图3新用户注册过程
课程设计说明书NO.7
图4事件监听流程
用户注册的界面设计:
用户注册界面使用了JDialog类。
在JavaSwing编程中,程序员还可以通过集成JDialog类来自定义对话框。
用户注册界面如图5所示,用户在线注册界面上填写自己的注册资料,其中必须填写的内容是用户昵称和密码:
可选的内容包括电子邮件、头像、性别、籍贯和留言等。
填写完注册信息后,单击【确定】按钮建立一个新用户。
若单击【取消】按钮,则放弃注册。
课程设计说明书NO.8
图5注册界面运行结果
2.4.2用户登录
监听登录事件:
用户在客户端程序中输入用户号码和密码,与服务器建立连接,向服务器发送登录请求。
服务器收到该请求后,通过JdbcOdbc读取数据库,与用户输入的信息做比较:
若用户输入的信息与数据库信息相同,则服务器向客户返回成功消息,将其Status字段设为1,并注册用户当前所使用的IP地址;
否则服务器向客户返回失败消息。
客户端收到服务器的成功确认后,打开聊天主窗口;
否则弹出失败信息。
客户端的事件驱动与服务器端的时间监听相对应。
Java的图形用户界面是由事件驱动的,并利用各种各样的监听器负责捕捉这些事件,因此要为某一个组件的某种事件添加监听器。
登录事件处理:
完成不同事件监听器的添加后,需根据用户的登录类型具体编程控制登录事件的处理过程。
客户端的事件监听器监听到某个事件后,会自动调用相关的方法。
这些方法只需要重载就可以处理相应的事件了。
界面设计:
界面设计主要用到了Jframe类,它也是属于Swing设计类别。
所有JFrame的基类,有一个标题为参数的构造函数,缺省关闭操作为系统退出,JFrame就是Windows的子类框架,是Java图形用户界面的基础,它就是我们通常所说的窗口,是Windows/XWindow应用程序的典型特征。
界面设计实现代码:
登录界面如图6所示。
用户向登录界面输入用户号码、密码、服务器地址名和端口。
服务器地址和端口应该是事先知道的,如果服务器有自己的域名,也可输入域名。
正确填写登录信息后,单击【登录】按钮,密码验证正确后完成登录过程。
课程设计说明书NO.9
图6登录界面
2.4.3主程序设计
用户完成登录后,客户端与服务器端建立连接。
连接建立成功后,客户向服务器请求读取好友名单;
服务器收到该请求,开始读取数据库中的friend表并得到好友的号码,再通过icq表读取好友资料,向客户端发送这些信息;
客户收到服务器信息后,在主窗口显示好友(即好友的头像和昵称)。
客户端还建立矢量(Vector)来存储好友昵称、jicq号码、头像编号和IP地址等信息。
主程序利用MainWin类实现,首先要定义成员变量,主程序构造函数用来生成MainWin类的实例(对象)、设置大小并显示,其实现代码如下:
publicclassMainWinextendsJFrameimplementsRunnable{
publicMainWin(ints,Stringsername,intserport){
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
myjicq=s;
server=sername;
serverport=serport;
jbInit();
ConnectServer(myjicq);
CreatUDP();
Findf=newFindFriend2(myjicq,server,serverport);
Findf.setBounds(200,150,300,300);
Thread=newThread(this);
Thread.start();
Catch(Exceptione){
e.printStackTrace();
课程设计说明书NO.10
主程序窗口设计:
主程序窗口需要添加两个监听器,它们分别用来监听窗口关闭事件和窗口激活事件。
主程序窗口类继承了JFrame类,其可能发生的窗口事件包括:
windowActivated(WindowEvente):
窗口得到焦点时触发;
windowClosed(WindowEvente):
窗口关闭之后触发;
windowClosing(WindowEvente):
窗口关闭时触发;
windowDeactivated(WindowEvente):
窗口失去焦点时触发;
windowOpened(WindowEvente):
窗口打开之后触发;
主程序窗口是通过在JFrame对象中添加AWT或者Swing组件而完成的。
但是,JFrame不是一个容器,只是一个框架,在其对象中添加组件需要利用其他的办法。
JFrame有一个内容面板(ContentPane),可将窗口的所有组件都添加在这个面板上,并利用JFrame提供的getContentPane和setContentPane犯法完成指定面板的设置。
这样通过面板可在JFrame对象中添加所需的组件。
窗口实现代码:
服务器连接:
服务器连接是在ConnectServer()函数中实现的。
本函数用到了具有连续性、有序性特点的流(Stream),根据服务器的IP地址和端口来完成客户端与服务器端的连接。
IP地址是网络中唯一的地址标识。
服务器连接过程分服务器端和客户端两个部分,执行流程如下:
服务器程序流程:
●程序初始化;
●填写本机地址信息;
●绑定并监听一个固定的端口;
●收到Client的连接后建立一个Socket连接;
●产生一个新的进程与Client进行通信和信息处理;
●子通信结束后中断与Client的连接。
客户端程序流程:
●填写服务器地址信息;
●连接服务器;
●与服务器通信和信息处理;
●通信结束后断开连接。
2.4.4消息通信的设计
创建数据报:
消息的收发主要是通过数据报服务实现的。
Java实现数据报通信的过程除了面向连接的Socket外,还有无连接的数据包Socket。
数据报是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它能否到达目的地,到达时内容是否会变化是不能准确知道的。
数据报的通信双方不需要建立连接,对于像聊天通信这些不需要很高质量的应用程序来说,数据报通信是一个非常好的选择。
课程设计说明书NO.11
首先,通信双方要建立数据包通信的Socket。
可以通过创建一个DatagramSocket对象来实现它,其构造方法为:
PublicDatagramSocket()构造一个数据报Socket,并使其与本地主机任何一个可用的端口连接。
若打不开Socket则抛出SocketException异常。
然后,处理接收缓冲区内的数据,获取服务结果。
最后,当通信完成后,可以使用DatagramSocket对象的close()方法来关闭数据报通信Socket。
当然,Java自己会自动关闭Socket,释放DatagramSocket和DatagramPacket
所占用的资源。
发送消息:
用户通过在好友列表中好友的IP地址,利用UDP协议与其他用户进行信息交流。
消息发送之前先创建一个数据报文包,用来实现无连接的包传送服务。
每个数据报文包是用DatagramPacket类来创建的,DatagramPacket对象封装了数据报包数据、包长度、目标地址和目标端口。
若客户端要发送数据报文包,则构造函数创建DatagramPacket对象,将需要发送的数据和包文目的地址信息放入对象之中。
图7发送消息流程
在发送的过程中利用构造函数DatagramPacket(bytebufferedarray[],intlength,InetAddressaddress,intport)构造了一个包长度为length的包,它是一个将数据传送到指定主机指定端口号上的数据报文包,参数length必须小于等于bufferedarray.length。
消息发送是通过调用DatagramPacket对象的send方法实现的,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。
Voidsend_mouseClicked(MpiseEvente){
课程设计说明书NO.12
Strings=sendtext.getText().triim();
Byte[]data=s.getBytes();
System.out.println(theip);
Theip.trim();
If(theip.equals(“null”)||theip.equals(““)||theip.equals(“0“)){
JOptionPane.showMessageDialog(this“:
-(对不起,不在线”,
”ok”,JOptionPane.INFORMATION_MESSAGE);
}else{
sendPacket=new
DatagramPacket(data,s.length(),InetAddress.getByName(theip),send(Port);
sendSocket.send(sendPacket);
}catch(IOExceptione2){
Semdtext.append(sendtext.getTet());
e2.printStackTrace();
Senddata.dispose();
监听好友的消息:
监听好友的消息与QQ好友上线监听功能非常相似。
系统首先定义一个空数组,该数组用于接受消息中的数据,然后创建数据报,使用receiveSocket.receive(receivePacket)函数等待接收数据报,取得数据报中的数据。
根据取得数据的类型,监听器将判定好友是否上线:
若有好友上线,则好友的头像变色,若有好友下线,则好友的头像变为灰色。
接收消息:
DatagramPacket类提供了4个函数来获取消息:
●Publicbyte[]getData():
返回一个字节数组,包含收到或要发送的数据报中的数据;
●PublicintgetLength():
返回发送或接收到的数据的长度;
●PublicInetAddressgetAddress():
返回一个发送或接收此数据报报文的机器的IP地址;
●PublicintgetPort():
返回发送或接收数据报的远程主机的端口号。
为了接收从服务器返回的结果数据报文包,需要建立一个新的DatagramPacket对象。
系统可调用DatagramPacket对象的receive()函数来接收数据报,并将DatagramPacket对象作为该函数的参数。
receive()方法会一直阻塞直至收到一个数据报文包,而该数据存放在DatagramPacket对象的缓冲区中。
数据报文包还包含了发送者的IP地址和端口号等信息。
2.4.5好友管理
查找好友:
好友查找可利用FindFriend2类来完成,FindFriend2类继承自JFrame类。
FindFriend2中定义的界面控件包括:
好友的昵称、性别、主旨、jicq号码、IP地址、在线状态、头像、电子邮件和个人留言等信息。
课程设计说明书NO.13
查找好友所需的网络变量定义如下:
●Socketsocket:
连接Socket;
●BuffereReaderin:
读入缓冲区;
●PrintWriterout:
输入缓冲区;
●Intmyid:
用户的号码;
●Stringserverhost:
发送端的主机地址;
●Intservport:
服务端的主机地址;
●DatagramPacketsendPacket:
存储发送信息的发送数据报;
●DatagramSocketsendSocket:
存储接收信息的接收数据报;
●intsendPort:
发送的端口号。
查找好友实现代码:
添加好友:
用户添加好友是聊天工具的基本功能之一。
添加好友的基本步骤如下:
●用户登录后,向服务器发送查找请求,服务器响应并读取数据库表icq,将结果返回给用户;
●用户在收到查询结果后选择用户B,向服务器发送添加好友请求,服务器收到请求后响应,更新数据库表friend,并从icq表中读取好友基本信息,将信息返回给用户A;
●用户A的客户端主窗口显示用户B,并通过UDP通知用户B;
●用户B收到服务器的确认消息,可决定是否添