1、3.系统详细设计3.1数据库设计:用户表User:列明类型长度是否为主键描述Usernamevarchar32是用户名Nickname昵称Password密码Genderchar1性别:缺省0 男Ageint4年龄City城市Online是否在线:缺省0 离线好友表Friend:Id8标识idusername外键Friendname用户名(好友)3.2页面设计3.2.1:登录页面:用户在登录页面,可以输入用户名和密码进入系统,当然,若用户输入的用户名和密码不正确,系统会给出提示,新用户也可以通过该页面链接到注册页面进行注册,然后回到该页面进行登录3.2.2:注册页面: 用户在登录页面可以直接登
2、录系统,若是新用户没有登录信息,则会被引导到该页面进行注册,注册新用户时,需要安装一定的规则输入用户信息,有必填项,以及相应的验证。3.2.3,登录成功后的用户主页面: 用户登录成功之后,在用户的主界面会显示出用户的好友列表等信息,同时也会显示出该用户的好友是否在线等信息。右键单击用户:搜索用户,并可以通过该页面添加好友,页面如下: 查看资料: 点击聊天室,可以实现群聊:3.2.4、服务器端代码: Server.java package mainserver;import java.io.IOException;import .ServerSocket;import .Socket;impor
3、t java.util.HashMap;import java.util.Map;/* * 服务器主线程,负责接收客户端连接,并开启相应线程 响应 * * 服务器的事务: 0,主线程,负责接收客户端连接,并开启相应线程 响应登陆用户请求 * 1,定时检测连接状态,并修改相应的用户状态,如果连接关闭(非正常关闭,例如 网络故障导致;而登陆用户正常退出由子线程负责处理状态的修改。),则 * 将相应用户的状态设为未登陆,以保证同一时刻一个用户只能 登陆一次。 PS:由于主线程无法很好的监控各套接字的状态,因此1该为在子线程中处理 * author Administrator */public cla
4、ss Server /* * 服务器状态: true:开启 false:关闭 private boolean running; private static final int SERVER_PORT = 9999; public static Map connections = new HashMap(); ServerSocket serverSocket; * 服务器参数初始化 private void init() public Server() * 服务器开启 public void start() init(); try serverSocket = new ServerSocke
5、t(SERVER_PORT); catch (IOException e) System.out.println(ServerSocket建立失败); e.printStackTrace(); return; startServer(); while (running) Socket socket = null; try System.out.println(Listenning. . socket = serverSocket.accept(); System.out.println(socket.getRemoteSocketAddress(); new ServiceHandler(so
6、cket).start(); catch (IOException e) e.printStackTrace(); public void closeServer() running = false; System.exit(0); private void startServer() running = true; public boolean isRunning() return running;ServiceHandler.javaimport java.io.BufferedReader;import java.io.InputStreamReader;import java.io.O
7、utputStream;import java.util.Arrays;import java.util.Iterator;import java.util.List;import messages.AddFriend;import messages.DelFriend;import messages.Friends;import messages.Info;import messages.Login;import messages.MessageEnd;import messages.Regist;import messages.SearchFriend;import messages.Se
8、nd;import messages.Update;import dao.Friend;import dao.FriendDAO;import dao.User;import dao.UserDAO; * 处理单个客户端请求的线程 如果socket读取或发送数据失败,按用户退出登陆处理public class ServiceHandler extends Thread private Socket socket; private BufferedReader in; private OutputStream out; private boolean isOK; private String c
9、urrentUser; public ServiceHandler(Socket socket) this.socket = socket; isOK = true; out = socket.getOutputStream(); isOK = false; in = new BufferedReader(new InputStreamReader(socket .getInputStream(); * 向客户端发送数据 如果发送失败,修改用户状态为未登录 * param msg public synchronized void send(String msg) if (!isOK) send
10、: + msg); / ShowErrorMsg.display(msg); out.write(msg.getBytes(); out.flush(); userQuit(); private synchronized String read() String tmp = null; tmp = in.readLine(); if (tmp != null) return tmp; return null; * 发送或接收数据失败,修改用户状态 * param b private void changeUserState(boolean b) / 设定为上线 if (b) synchroni
11、zed (Server.connections) Server.connections.put(this.currentUser, this); else Server.connections.remove(this.currentUser); new UserDAO().setOnline(this.currentUser, b); * 如果读取失败,修改用户状态为未登录 从客户端读取数据 * param socket private String receiveTitle() StringBuffer buffer = new StringBuffer(); return buffer.t
12、oString(); if (tmp = in.readLine() ! buffer.append(tmp); return buffer.toString(); private void userQuit() System.out.println(失去一个连接。 isOK = false; changeUserState(false); public void run() while (isOK) String title = this.receiveTitle(); if (title != null & title.length()!=0) if (title.equals(Login
13、.title) System.out.println(get: + Login.title); System.out.println(this.read(); loginHandle(); else if (title.equals(AddFriend.title) this.read(); addFriendHandler(); else if (title.equals(Friends.title) friendsHandler(); else if (title.equals(Regist.title) registHandler(); else if (title.equals(Sea
14、rchFriend.title) searchFriendHandler(); else if (title.equals(Send.title) int id = Integer.parseInt(this.read(); sendHandler(id); else if (title.equals(Update.title) updateHandler(); else if (title.equals(Info.title) infoHandler(); else if (title.equals(DelFriend.title) delFriendHandler(); else noth
15、ing catched socket.close(); private void delFriendHandler() String user = this.read(); this.read(); new FriendDAO().delete(user, this.currentUser); this.send(success + MessageEnd.end + DelFriend.title + MessageEnd.end + MessageEnd.end); private void infoHandler() String username = this.read(); User
16、result = new UserDAO().getUserInfo(username); StringBuffer reply = new StringBuffer(); reply.append( + MessageEnd.end + Info.title + MessageEnd.end); reply.append(result.getAge() + MessageEnd.end + result.getCity() reply.append(result.getGender() + MessageEnd.end + result.getNickName() reply.append(
17、result.getPassWord() + MessageEnd.end + result.getUserName() + MessageEnd.end); reply.append(MessageEnd.end); this.send(reply.toString(); private void updateHandler() User user = new User(); user.setUserName(this.currentUser); user.setNickName(this.read(); user.setPassWord(this.read(); user.setCity(
18、this.read(); user.setAge(Integer.parseInt(this.read(); user.setGender(this.read().charAt(0); new UserDAO().update(user); + MessageEnd.end + Update.title + MessageEnd.end + Messa geEnd.end); private void sendHandler(int id) String target = this.read(); String content = this.read(); if (Server.connect
19、ions.containsKey(target) ServiceHandler hand = Server.connections.get(target);connection: + target + got if (hand !got inside hand.send( + MessageEnd.end + send + MessageEnd.end + (id) + MessageEnd.end + this.currentUser + MessageEnd.end + content.replace(n, #) + MessageEnd.end + MessageEnd.end); pr
20、ivate void searchFriendHandler() String name = this.read(); String value = this.read(); buffer.append( + MessageEnd.end); buffer.append(SearchFriend.title + MessageEnd.end); List result = new UserDAO().getUserFullName(value); for (int index = 0; index result.size(); index+) buffer.append(result.get(
21、index) + MessageEnd.end); buffer.append(MessageEnd.end); this.send(buffer.toString(); private void registHandler() user.setUserName(this.read(); System.out.println(user.getUserName() + read System.out.println(user.getPassWord() + System.out.println(user.getNickName() + System.out.println(user.getCity() + user.setOnline(false); if (new UserDAO().insertUser(user)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1