聊天室Java课程设计Word下载.docx
《聊天室Java课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《聊天室Java课程设计Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
3.系统详细设计
3.1数据库设计:
用户表User:
列明
类型
长度
是否为主键
描述
Username
varchar
32
是
用户名
Nickname
昵称
Password
密码
Gender
char
1
性别:
缺省0男
Age
int
4
年龄
City
城市
Online
是否在线:
缺省0离线
好友表Friend:
Id
8
标识id
username
外键
Friendname
用户名(好友)
3.2页面设计
3.2.1:
登录页面:
用户在登录页面,可以输入用户名和密码进入系统,当然,若用户输入的用户名和密码不正确,系统会给出提示,新用户也可以通过该页面链接到注册页面进行注册,然后回到该页面进行登录
3.2.2:
注册页面:
用户在登录页面可以直接登录系统,若是新用户没有登录信息,则会被引导到该页面进行注册,注册新用户时,需要安装一定的规则输入用户信息,有必填项,以及相应的验证。
3.2.3,登录成功后的用户主页面:
用户登录成功之后,在用户的主界面会显示出用户的好友列表等信息,同时也会显示出该用户的好友是否在线等信息。
右键单击用户:
搜索用户,并可以通过该页面添加好友,页面如下:
查看资料:
点击聊天室,可以实现群聊:
3.2.4、服务器端代码:
Server.java
packagemainserver;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
importjava.util.HashMap;
importjava.util.Map;
/**
*服务器主线程,负责接收客户端连接,并开启相应线程响应
*
*服务器的事务:
0,主线程,负责接收客户端连接,并开启相应线程响应登陆用户请求
*1,定时检测连接状态,并修改相应的用户状态,如果连接关闭(非正常关闭,例如网络故障导致;
而登陆用户正常退出由子线程负责处理状态的修改。
),则
*将相应用户的状态设为未登陆,以保证同一时刻一个用户只能登陆一次。
PS:
由于主线程无法很好的监控各套接字的状态,因此1该为在子线程中处理
*@authorAdministrator
*/
publicclassServer{
/**
*服务器状态:
true:
开启false:
关闭
privatebooleanrunning;
privatestaticfinalintSERVER_PORT=9999;
publicstaticMap<
String,ServiceHandler>
connections=newHashMap<
();
ServerSocketserverSocket;
*服务器参数初始化
privatevoidinit(){
}
publicServer(){
*服务器开启
publicvoidstart(){
init();
try{
serverSocket=newServerSocket(SERVER_PORT);
}catch(IOExceptione){
System.out.println("
ServerSocket建立失败"
);
e.printStackTrace();
return;
}
startServer();
while(running){
Socketsocket=null;
try{
System.out.println("
Listenning......"
socket=serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress());
newServiceHandler(socket).start();
}catch(IOExceptione){
e.printStackTrace();
}
publicvoidcloseServer(){
running=false;
System.exit(0);
privatevoidstartServer(){
running=true;
publicbooleanisRunning(){
returnrunning;
}
ServiceHandler.java
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.util.Arrays;
importjava.util.Iterator;
importjava.util.List;
importmessages.AddFriend;
importmessages.DelFriend;
importmessages.Friends;
importmessages.Info;
importmessages.Login;
importmessages.MessageEnd;
importmessages.Regist;
importmessages.SearchFriend;
importmessages.Send;
importmessages.Update;
importdao.Friend;
importdao.FriendDAO;
importdao.User;
importdao.UserDAO;
*处理单个客户端请求的线程如果socket读取或发送数据失败,按用户退出登陆处理
publicclassServiceHandlerextendsThread{
privateSocketsocket;
privateBufferedReaderin;
privateOutputStreamout;
privatebooleanisOK;
privateStringcurrentUser;
publicServiceHandler(Socketsocket){
this.socket=socket;
isOK=true;
out=socket.getOutputStream();
isOK=false;
in=newBufferedReader(newInputStreamReader(socket
.getInputStream()));
*向客户端发送数据如果发送失败,修改用户状态为未登录
*@parammsg
publicsynchronizedvoidsend(Stringmsg){
if(!
isOK){
send:
"
+msg);
//ShowErrorMsg.display(msg);
out.write(msg.getBytes());
out.flush();
userQuit();
privatesynchronizedStringread(){
Stringtmp=null;
tmp=in.readLine();
if(tmp!
=null){
returntmp;
returnnull;
*发送或接收数据失败,修改用户状态
*@paramb
privatevoidchangeUserState(booleanb){
//设定为上线
if(b){
synchronized(Server.connections){
Server.connections.put(this.currentUser,this);
}else{
Server.connections.remove(this.currentUser);
newUserDAO().setOnline(this.currentUser,b);
*如果读取失败,修改用户状态为未登录从客户端读取数据
*@paramsocket
privateStringreceiveTitle(){
StringBufferbuffer=newStringBuffer();
returnbuffer.toString();
if((tmp=in.readLine())!
buffer.append(tmp);
returnbuffer.toString();
privatevoiduserQuit(){
System.out.println("
失去一个连接。
"
isOK=false;
changeUserState(false);
publicvoidrun(){
while(isOK){
Stringtitle=this.receiveTitle();
if(title!
=null&
&
title.length()!
=0){
if(title.equals(Login.title)){
System.out.println("
get:
+Login.title);
System.out.println(this.read());
loginHandle();
}elseif(title.equals(AddFriend.title)){
this.read();
addFriendHandler();
}elseif(title.equals(Friends.title)){
friendsHandler();
}elseif(title.equals(Regist.title)){
registHandler();
}elseif(title.equals(SearchFriend.title)){
searchFriendHandler();
}elseif(title.equals(Send.title)){
intid=Integer.parseInt(this.read());
sendHandler(id);
}elseif(title.equals(Update.title)){
updateHandler();
}elseif(title.equals(Info.title)){
infoHandler();
}elseif(title.equals(DelFriend.title)){
delFriendHandler();
}else{
nothingcatched"
}
socket.close();
privatevoiddelFriendHandler(){
Stringuser=this.read();
this.read();
newFriendDAO().delete(user,this.currentUser);
this.send("
success"
+MessageEnd.end+DelFriend.title+MessageEnd.end
+MessageEnd.end);
privatevoidinfoHandler(){
Stringusername=this.read();
Userresult=newUserDAO().getUserInfo(username);
StringBufferreply=newStringBuffer();
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(result.getPassWord()+MessageEnd.end
+result.getUserName()+MessageEnd.end);
reply.append(MessageEnd.end);
this.send(reply.toString());
privatevoidupdateHandler(){
Useruser=newUser();
user.setUserName(this.currentUser);
user.setNickName(this.read());
user.setPassWord(this.read());
user.setCity(this.read());
user.setAge(Integer.parseInt(this.read()));
user.setGender(this.read().charAt(0));
newUserDAO().update(user);
+MessageEnd.end+Update.title+MessageEnd.end
+MessageEnd.end);
privatevoidsendHandler(intid){
Stringtarget=this.read();
Stringcontent=this.read();
if(Server.connections.containsKey(target)){
ServiceHandlerhand=Server.connections.get(target);
connection:
+target+"
got"
if(hand!
gotinside"
hand.send("
+MessageEnd.end+"
send"
+MessageEnd.end
+(id)+MessageEnd.end+this.currentUser
+MessageEnd.end+content.replace('
\n'
'
#'
)
+MessageEnd.end+MessageEnd.end);
privatevoidsearchFriendHandler(){
Stringname=this.read();
Stringvalue=this.read();
buffer.append("
+MessageEnd.end);
buffer.append(SearchFriend.title+MessageEnd.end);
List<
String>
result=newUserDAO().getUserFullName(value);
for(intindex=0;
index<
result.size();
index++){
buffer.append(result.get(index)+MessageEnd.end);
buffer.append(MessageEnd.end);
this.send(buffer.toString());
privatevoidregistHandler(){
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(newUserDAO().insertUser(user)){