内蒙古农业大学学士学位论文 12
3 系统分析与设计方案 3.1 聊天系统的总体设计要点
聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的
因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:
1、实现思想
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
2、服务器端工作流程
服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。
3、客户端工作流程
客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。
3 .2 聊天系统的设计步骤及功能模块划分
聊天系统工作原理图
内蒙古农业大学学士学位论文 13
3.3 聊天系统各功能模块
(1)服务器程序模块
服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。
服务器线程源码: package qq.server;
import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*;
import qq.dao.hibernate.IServiceDao; import qq.entity.*;
public class ServerController {
private User user;
内蒙古农业大学学士学位论文 14
private Socket s; private IServiceDao dao; private ObjectInputStream ois; private ObjectOutputStream oos; private OnlineUser onlineUser;
public ServerController(Socket s) { }
public void handle() throws Exception {
ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){
Request req=(Request)ois.readObject(); ois.read();
RequestType type=req.getType(); if(type.equals(RequestType.exit)){
exitHandle(); break;
loginHandle(req); registerHandle(); offlineHandle(); break;
changeInformationHandle(); modifypasswdHandle(req);
super();
dao=ServerMainClass.userDao; this.s = s;
}else if(type.equals(RequestType.login)){ }else if(type.equals(RequestType.register)){ }else if(type.equals(RequestType.offline)){
}else if(type.equals(RequestType.changeInformation)){ }else if(type.equals(RequestType.modifypasswd)){
内蒙古农业大学学士学位论文 15
}
}
}else if(type.equals(RequestType.sendMessage)){ }
sendMessageHandle(req); receiveFileHandle(req); sendFileHandle(req);
}else if(type.equals(RequestType.receiveFile)){ }else if(type.equals(RequestType.sendFile)){
private void modifypasswdHandle(Request req) { }
private void changeInformationHandle() {
try {
User user=(User)ois.readObject(); Long id=Long.parseLong(req.getData(\String oldpwd=req.getData(\String newpwd=req.getData(\
Response res=new Response(RequestType.modifypasswd); try { }
dao.updatePwd(id, oldpwd, newpwd); res.setData(1); try { } try { }
oos.writeObject(res); e1.printStackTrace(); } catch (IOException e1) {
oos.writeObject(res); e.printStackTrace(); } catch (IOException e) {
} catch (RuntimeException e) {
内蒙古农业大学学士学位论文 16
}
}
Response res=new Response(RequestType.changeInformation); try { }
e.printStackTrace(); e.printStackTrace();
dao.updateUser(user);
res.setData(1);//修改成功返回值带一个整形值 oos.writeObject(res); oos.flush();
oos.writeObject(res);//失败则返回值不带参数 oos.flush();
e.printStackTrace();
} catch (RuntimeException e) {
} catch (IOException e) {
} catch (ClassNotFoundException e) {
private void exitHandle() { }
//发送文件
private void sendFileHandle(Request req) {
try { }
User u=(User)ois.readObject();
e.printStackTrace(); try { }
s.close();
e.printStackTrace(); } catch (IOException e) {
// // // // // //
}
} catch (Exception e) {