📄 controller.java
字号:
package qianqian.p2pchat.control;
import qianqian.gui.Server;
import qianqian.p2pchat.constant.Const;
import qianqian.p2pchat.message.UserMessage;
import qianqian.pooledb.DBManager;
import qianqian.pooledb.PooledCon;
import java.sql.Connection;
import java.net.InetAddress;
public class Controller {
private static Controller controller = null;
private static UdpDispatcher dispatcher = null;
private Controller() {
try {
dispatcher = new UdpDispatcher();
} catch (java.net.SocketException e) {
javax.swing.JOptionPane.showMessageDialog(null, "UDP端口绑定失败!", "提示",
javax.swing.JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
public static Controller getInstance() {
if (controller == null) {
synchronized (Controller.class) {
if (controller == null)
controller = new Controller();
}
}
return controller;
}
public UdpDispatcher getDispatcher() {
return dispatcher;
}
public void quit() throws Exception {
PooledCon.getInstance().closePool();
getDispatcher().closeDispatcher();
}
public void parseMessage(final UserMessage iMsg, final InetAddress iAddr) {
char code = iMsg.getCode();
switch (code) {
// 用户登录
case Const.CODE_USER_LOGIN:
Server.getInstance()
.setLog("UDP:", iAddr.getHostAddress(), "Login");
dealLogin(iMsg, iAddr);
return;
// 用户注册
case Const.CODE_USER_REGIST:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Register");
dealRegist(iMsg, iAddr);
return;
// 用户更新
case Const.CODE_USER_MODIFY:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Modify");
dealModify(iMsg, iAddr);
return;
// 查找用户
case Const.CODE_SEARCH_FRIEND:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Search");
dealSearch(iMsg, iAddr);
return;
// 添加好友
case Const.CODE_ADD_FRIEND:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(), "Add");
dealAddFrnd(iMsg, iAddr);
return;
// 删除好友
case Const.CODE_DELETE_FRIEND:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Delete");
dealDelFrnd(iMsg, iAddr);
return;
// 用户下线
case Const.CODE_OFF_LINE:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Logout");
dealOffLine(iMsg, iAddr);
return;
// 找回密码
case Const.CODE_FIND_PASSWD:
Server.getInstance().setLog("UDP:", iAddr.getHostAddress(),
"Passwd");
dealFindPwd(iMsg, iAddr);
return;
}
}
private void dealLogin(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
Peer peer = checkLogin(iMsg.getFrom(), iAddr.getHostAddress());
if (peer != null) {
iMsg.setFrom(peer);
if (peer.getUserIp() != null) {
iMsg.setCode(Const.CODE_FORCE_PART);
try {
Controller.getInstance().getDispatcher()
.dispatchToClient(
iMsg,
InetAddress.getByName(peer
.getUserIp()));
} catch (Exception e) {
e.printStackTrace();
}
}
iMsg.setCode(Const.CODE_LOGIN_SUCCESS);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
} else {
iMsg.setCode(Const.CODE_LOGIN_FAIL);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
}
}
private Peer checkLogin(Peer peer, String ip) {
try {
Connection con = PooledCon.getInstance().getCon();
peer = DBManager.checkLogin(con, peer.getUserId(), peer
.getPassWord(), ip);
if (peer == null) {
PooledCon.getInstance().releaseCon(con);
return null;
}
peer
.setFriends(DBManager.getFriends(con, peer
.getUserId()));
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
}
return peer;
}
}).start();
}
private void dealRegist(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
Peer peer = checkRegist(iMsg.getFrom());
if (peer != null) {
iMsg.setCode(Const.CODE_REGIST_SUCCESS);
iMsg.setFrom(peer);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
} else {
iMsg.setCode(Const.CODE_REGIST_FAIL);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
}
}
private Peer checkRegist(Peer peer) {
String id = null;
if (peer.getName().isEmpty() || peer.getPassWord().isEmpty()
|| peer.getEmail().isEmpty())
return null;
try {
Connection con = PooledCon.getInstance().getCon();
id = DBManager.addNewUser(con, peer.getPassWord(), peer
.getName(), peer.getEmail(), peer.getGender());
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
return null;
}
if (id == null)
return null;
peer = new Peer(id, peer.getName(), peer.getGender(), peer
.getEmail(), null);
return peer;
}
}).start();
}
private void dealSearch(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
if (checkSearch(iMsg.getFrom())) {
iMsg.setCode(Const.CODE_SEARCH_RESULT);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
}
}
private boolean checkSearch(Peer info) {
if (!info.getUserId().isEmpty()
|| !info.getPassWord().isEmpty()) {
try {
Connection con = PooledCon.getInstance().getCon();
info.setFriends(DBManager.searchUser(con, info
.getUserId(), info.getPassWord()));
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
}).start();
}
public void dealAddFrnd(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
Peer peer = iMsg.getFrom();// me,frndId
if (checkAddFrnd(iMsg, peer.getUserId())) {
iMsg.setCode(Const.CODE_FRIEND_INFO);
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
}
if (iMsg.getFrom() != null
&& iMsg.getFrom().getUserIp() != null) {// 好友在线
iMsg.setCode(Const.CODE_ADD_FRIEND);
iMsg.setFrom(peer);
InetAddress iAddr = null;
try {
iAddr = InetAddress.getByName(iMsg.getFrom()
.getUserIp());
} catch (Exception e) {
e.printStackTrace();
return;
}
Controller.getInstance().getDispatcher().dispatchToClient(
iMsg, iAddr);
}
}
private boolean checkAddFrnd(UserMessage iMsg, String userId) {
Peer peer = null;
String frndId = iMsg.getInfo();
if (userId.isEmpty() || frndId.isEmpty()) {
iMsg.setFrom(null);
return false;
}
try {
java.sql.Connection con = PooledCon.getInstance().getCon();
if (DBManager.checkFriend(con, userId, frndId)) {
PooledCon.getInstance().releaseCon(con);
iMsg.setFrom(null);
return false;
}
DBManager.addNewFrnd(con, userId, frndId);
if (!DBManager.checkFriend(con, frndId, userId)) {
peer = DBManager.searchUser(con, frndId, "").getFirst();
}
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
iMsg.setFrom(null);
return false;
}
iMsg.setFrom(peer);
return true;
}
}).start();
}
private void dealModify(final UserMessage iMsg, final InetAddress iAddr) {
Peer peer = iMsg.getFrom();
try {
Connection con = PooledCon.getInstance().getCon();
boolean rst = DBManager.modifyUser(con, peer.getUserId(), iMsg
.getInfo(), peer.getName(), peer.getPassWord(), peer
.getGender(), peer.getEmail());
if (rst) {
iMsg.setCode(Const.CODE_MODIFY_SUCCESS);
iMsg.setInfo(peer.getName());
Controller.getInstance().getDispatcher().dispatchToClient(iMsg,
iAddr);
} else {
iMsg.setCode(Const.CODE_MODIFY_FAIL);
Controller.getInstance().getDispatcher().dispatchToClient(iMsg,
iAddr);
}
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
}
}
private void dealDelFrnd(final UserMessage iMsg, final InetAddress iAddr) {
String userId = iMsg.getFrom().getUserId();
String frndId = iMsg.getInfo();
try {
Connection con = PooledCon.getInstance().getCon();
DBManager.delFriend(con, userId, frndId);
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
return;
}
iMsg.setCode(Const.CODE_DELETE_SUCCESS);
iMsg.setInfo(frndId);
Controller.getInstance().getDispatcher().dispatchToClient(iMsg, iAddr);
}
private void dealOffLine(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
try {
String ip = iAddr.getHostAddress();
Connection con = PooledCon.getInstance().getCon();
DBManager.offLine(con, iMsg.getFrom().getUserId(), ip);
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void dealFindPwd(final UserMessage iMsg, final InetAddress iAddr) {
new Thread(new Runnable() {
public void run() {
try {
Connection con = PooledCon.getInstance().getCon();
String passwd = System.currentTimeMillis() + "";
if (DBManager.findPasswd(con, iMsg.getFrom().getUserId(),
passwd, iMsg.getInfo())) {
if (sendEmail(iMsg.getInfo(), passwd)) {
iMsg.setCode(Const.CODE_FIND_RESP);
Controller.getInstance().getDispatcher()
.dispatchToClient(iMsg, iAddr);
}
}
PooledCon.getInstance().releaseCon(con);
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean sendEmail(final String email, final String pwd) {
try {
new Sender().send(email, pwd);
} catch (Exception e) {
return false;
}
return true;
}
}).start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -