📄 qqserver.java
字号:
package qq;
import java.io.*;
import java.net.*;
import java.util.Hashtable;
public class QQServer implements Runnable {
//变量声明
static Hashtable onLineUser = new Hashtable();
int change = 0;
Socket s = null;
ObjectInputStream objIn = null;
public void run() {
try {
DataControl dataControl = new DataControl();
dataControl.readAllUserInfo();
ServerSocket ss = new ServerSocket(10000);
while (true) {
s = ss.accept();
objIn = new ObjectInputStream(s.getInputStream());
try {
Object obj = objIn.readObject();
if (obj instanceof UserInfo) {
UserInfo ui = (UserInfo) obj;
if (ui.getInfoType() == 1) { //用户登陆
this.login(ui); //执行登陆
} else if (ui.getInfoType() == 5) { //返回用户好友列表
this.returnUserFriendList(ui);
} else if (ui.getInfoType() == 2) { //用户注册
this.register(ui);
} else if (ui.getInfoType() == 3) { //修改用户个人信息
this.updateUserInfo(ui);
} else if (ui.getInfoType() == 4) { //用户退出登陆
((UserInfo) onLineUser.get(ui.getUserId())).
setOnLine(false);
((UserInfo) DataControl.userInfo.get(ui.
getUserId())).setOnLine(false);
change++;
}
} else if (obj instanceof String) { // 处理用户好友操作
String[] temp = ((String) obj).split(";", 3);
int requestId = Integer.parseInt(temp[1]);
int friendId = Integer.parseInt(temp[2]);
if (temp[0].equals("A")) { //添加好友
//判断该用户是否存在
if (DataControl.userInfo.containsKey(friendId)) {
UserInfo addFriend = new UserInfo();
addFriend = (UserInfo) DataControl.userInfo.get(
friendId);
addFriend.setInfoType(6);
addFriend.setOnLine(true);
String userIp = ((UserInfo) onLineUser.get(
requestId)).getUserIp();
int userPort = ((UserInfo) onLineUser.get(
requestId)).getUserPort();
this.send(userIp, userPort, addFriend);
if (onLineUser.containsKey(friendId)) {
addFriend = (UserInfo) onLineUser.get(requestId);
addFriend.setInfoType(6);
addFriend.setOnLine(true);
userIp = ((UserInfo) onLineUser.get(
friendId)).getUserIp();
userPort = ((UserInfo) onLineUser.get(
friendId)).getUserPort();
this.send(userIp, userPort, addFriend);
}
dataControl.addFriend(requestId, addFriend);
} else { //用户不存在返回false
UserInfo addFriend = new UserInfo();
addFriend.setInfoType(6);
addFriend.setOnLine(false);
String userIp = ((UserInfo) onLineUser.get(
requestId)).getUserIp();
int userPort = ((UserInfo) onLineUser.get(
requestId)).getUserPort();
this.send(userIp, userPort, addFriend);
}
} else if (temp[0].equals("D")) { //删除好友
if (DataControl.userInfo.containsKey(friendId)) {
Hashtable userFriendList = new Hashtable();
userFriendList = dataControl.readUserFriendList(
requestId);
if (userFriendList.containsKey(friendId)) { //判断是否为好友
UserInfo deleteFriend = new UserInfo();
deleteFriend = (UserInfo) userFriendList.
get(friendId);
deleteFriend.setInfoType(7);
deleteFriend.setOnLine(true);
String userIp = ((UserInfo) onLineUser.get(
requestId)).getUserIp();
int userPort = ((UserInfo) onLineUser.get(
requestId)).getUserPort();
this.send(userIp, userPort, deleteFriend);
if (onLineUser.containsKey(friendId)) {
deleteFriend = (UserInfo) DataControl.
userInfo.get(requestId);
deleteFriend.setInfoType(7);
deleteFriend.setOnLine(true);
userIp = ((UserInfo) onLineUser.get(
friendId)).getUserIp();
userPort = ((UserInfo) onLineUser.get(
friendId)).getUserPort();
this.send(userIp, userPort,
deleteFriend);
}
dataControl.deleteFriend(requestId,
deleteFriend);
} else { //不是好友返回false
UserInfo deleteFriend = new UserInfo();
deleteFriend.setInfoType(7);
deleteFriend.setOnLine(false);
String userIp = ((UserInfo) onLineUser.get(
requestId)).getUserIp();
int userPort = ((UserInfo) onLineUser.get(
requestId)).getUserPort();
this.send(userIp, userPort, deleteFriend);
}
} else { //用户不存在返回false
UserInfo deleteFriend = new UserInfo();
deleteFriend.setInfoType(7);
deleteFriend.setOnLine(false);
String userIp = ((UserInfo) onLineUser.get(
requestId)).getUserIp();
int userPort = ((UserInfo) onLineUser.get(
requestId)).getUserPort();
this.send(userIp, userPort, deleteFriend);
}
}
} else if (obj instanceof Message) { //处理聊天信息
Message msg = (Message) obj;
//判断好友是否在线
if (this.onLineUser.containsKey(msg.getToId())) {
String userIp = ((UserInfo)this.onLineUser.get(msg.
getToId())).getUserIp();
int userPort = ((UserInfo)this.onLineUser.get(msg.
getToId())).getUserPort();
System.out.println(msg.toString());
this.send(userIp, userPort, msg);
} else {
//保存聊天信息(待实现)
//saveMessage();
int temp = msg.getToId();
msg.setToId(msg.getFromId());
msg.setFromId(temp);
msg.setFromName("系统消息");
msg.setMessage("好友不在线!");
String userIp = ((UserInfo)this.onLineUser.get(msg.
getToId())).getUserIp();
int userPort = ((UserInfo)this.onLineUser.get(msg.
getToId())).getUserPort();
System.out.println(msg.toString());
this.send(userIp, userPort, msg);
}
}
} catch (Exception e) {}
//当用户信息发生变化时保存信息
if (change != 0) {
dataControl.saveAllUserInfo();
change = 0;
}
}
} catch (Exception e) {}
}
//用户登陆
private void login(UserInfo userInfo) {
//判断帐户是否存在
if (DataControl.userInfo.containsKey(userInfo.getUserId())) {
//判断密码是否正确
if (userInfo.getPassWord().equals(((UserInfo) DataControl.
userInfo.get(userInfo.getUserId())).
getPassWord())) {
((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
setOnLine(true);
((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
setUserIp(userInfo.getUserIp());
userInfo.setUserName(((UserInfo) DataControl.userInfo.get(
userInfo.getUserId())).getUserName());
userInfo.setOnLine(true);
this.send(userInfo.getUserIp(), userInfo.getUserPort(),
userInfo);
this.onLineUser.put(userInfo.getUserId(), userInfo); //将用户添加到在线列表
change++;
} else { //密码错误返回false
userInfo.setOnLine(false);
this.send(userInfo.getUserIp(), userInfo.getUserPort(),
userInfo);
}
} else { //帐号不存在返回false
userInfo.setOnLine(false);
this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
}
}
//返回用户好友列表
private void returnUserFriendList(UserInfo userInfo) {
Hashtable userFriendList = new Hashtable();
DataControl dataControl = new DataControl();
userFriendList = dataControl.readUserFriendList(userInfo.getUserId());
this.send(userInfo.getUserIp(), userInfo.getUserPort(), userFriendList);
}
//用户注册
private void register(UserInfo userInfo) {
userInfo.setUserId(DataControl.userInfo.size() + 1);
DataControl.userInfo.put(userInfo.getUserId(), userInfo);
this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
try {
File file = new File("Data//" + userInfo.getUserId() + ".dat");
file.createNewFile();
} catch (IOException ex) {
}
change++;
}
//修改用户个人信息
private void updateUserInfo(UserInfo userInfo) {
((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
setUserName(userInfo.getUserName());
((UserInfo) DataControl.userInfo.get(userInfo.getUserId())).
setPassWord(userInfo.getPassWord());
userInfo.setOnLine(true);
this.send(userInfo.getUserIp(), userInfo.getUserPort(), userInfo);
change++;
}
//转发信息
private void send(String userIp, int userPort, Object obj) {
try {
Socket socket = new Socket(userIp, userPort);
ObjectOutputStream objOut = new ObjectOutputStream(socket.
getOutputStream());
objOut.writeObject(obj);
objOut.flush();
objOut.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
QQServer qq = new QQServer();
Thread server = new Thread(qq);
server.start();
} catch (Exception e) {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -