📄 controller.java
字号:
package qianqian.p2pchat.control;
import qianqian.p2pchat.constant.Const;
import qianqian.p2pchat.filetrans.FileTransporter;
import qianqian.p2pchat.filetrans.RecvfileThread;
import qianqian.p2pchat.filetrans.SendfileThread;
import qianqian.p2pchat.gui.FindPwdForm;
import qianqian.p2pchat.gui.LoginForm;
import qianqian.p2pchat.gui.RegisterForm;
import qianqian.p2pchat.gui.SearchForm;
import qianqian.p2pchat.gui.UserRoomForm;
import qianqian.p2pchat.message.RoomMessage;
import qianqian.p2pchat.message.Message;
import qianqian.p2pchat.message.P2PMessage;
import qianqian.p2pchat.message.SystemMessage;
import qianqian.p2pchat.message.UserMessage;
public class Controller {
private static Controller controller = null;
private static boolean isOn = false;
private Dispatcher dispatcher = null;
private UdpDispatcher uDispatcher = null;
private java.util.ArrayList<String> chatroomList = new java.util.ArrayList<String>();
private java.util.TreeMap<Peer, P2PConversation> prep2pconvs = new java.util.TreeMap<Peer, P2PConversation>();
private Room curRoom = null;
private Peer me = null;
private DispatchThread dispThread = null;
private boolean roomFree = true;
private String reqRoom = null;
private Controller() throws Exception {
dispatcher = new MultiDispatcher();
uDispatcher = new UdpDispatcher();
FileTransporter.getInstance();
me = Peer.anonymous;
}
public static Controller getInstance() {
try {
if (controller == null) {
synchronized (Controller.class) {
if (controller == null) {
controller = new Controller();
isOn = true;
}
}
}
} catch (Exception ex) {
isOn = false;
}
return controller;
}
public static boolean isOn() {
return isOn;
}
public Dispatcher getDispatcher() {
return dispatcher;
}
public Dispatcher getUdpDispatcher() {
return uDispatcher;
}
public boolean setNickName(String iNick, char iGender) {
me = new Peer(iNick, iGender);
me.setStatus(Const.STATUS_ASK_NICK);
SystemMessage newMsg = new SystemMessage(Peer.anonymous,
Const.CODE_NICK_FREE, iNick);
getDispatcher().dispatchToAll(newMsg);
try {
synchronized (Const.waitForNickAck) {
Const.waitForNickAck.wait(Const.WaitTimeOut);
}
} catch (InterruptedException ex) {
}
if (me.getStatus() == Const.STATUS_NICK_FAIL)
return false;
me.setStatus(Const.STATUS_AUTH);
return true;
}
public void quit() {
// 广播线程关闭
if (dispThread != null) {
dispThread.interrupt();
dispThread = null;
}
// 断开网络连接
if (curRoom != null) {
if (curRoom.getName().equals(Const.DefRoom)) {
UserMessage msg = new UserMessage(Const.CODE_OFF_LINE, getMe());
getUdpDispatcher().dispatchToServer(msg, Const.UdpIp);
} else {
SystemMessage msg = new SystemMessage(getMe(),
Const.CODE_LEFT_ROOM, curRoom.getName());
getDispatcher().dispatchToAll(msg);
}
}
// 关闭广播套接字
getUdpDispatcher().closeDispatcher();
getDispatcher().closeDispatcher();
// 关闭文件传输套接字
SendfileThread.forceOff();
RecvfileThread.forceOff();
FileTransporter.getInstance().closeTransporter();
// 关闭所以聊天窗口
java.util.Iterator<P2PConversation> iter = prep2pconvs.values()
.iterator();
while (iter.hasNext()) {
iter.next().exit();
}
// 关闭控制器
controller = null;
isOn = false;
System.exit(0);
}
public boolean isRoomFree(String iRoomName) {
roomFree = true;
SystemMessage newMsg = new SystemMessage(getMe(), Const.CODE_ROOM_FREE,
iRoomName);
getDispatcher().dispatchToAll(newMsg);
try {
synchronized (Const.waitForRoomAck) {
Const.waitForRoomAck.wait(Const.WaitTimeOut);
}
} catch (InterruptedException ex) {
}
return roomFree;
}
public String[] getAvailRooms() {
String[] outArr = new String[chatroomList.size()];
chatroomList.toArray(outArr);
return outArr;
}
public boolean containsRoom(String room) {
return chatroomList.contains(room);
}
public void setAndMultiCastRoom(Room iRoom) {
curRoom = iRoom;
curRoom.addPeer(getMe());
reqRoom = null;
SystemMessage advMsg = new SystemMessage(controller.getMe(),
Const.CODE_ROOM_DISP, iRoom.getName());
getDispatcher().dispatchToAll(advMsg);
if (dispThread != null) {
dispThread.interrupt();
dispThread = null;
}
dispThread = new DispatchThread(curRoom);
dispThread.start();
}
public void sendRoomMessage(String iMsg) {
if (curRoom == null)
return;
RoomMessage newMsg = new RoomMessage(iMsg, getMe(), curRoom);
getDispatcher().dispatchToAll(newMsg);
}
public Room getCurrentRoom() {
return curRoom;
}
public boolean hasJoined() {
return curRoom != null;
}
public void sendP2PMsg(Peer iTo, char code, String iMsg) {
P2PMessage newMsg = new P2PMessage(code, iMsg, getMe(), iTo);
getDispatcher().dispatchToAll(newMsg);
}
public void sendImage(Peer iTo, char code, byte[] imgByte, int len,
String type, String iMsg) {
P2PMessage newMsg = new P2PMessage(code, iMsg, imgByte, len, type,
getMe(), iTo);
getDispatcher().dispatchToAll(newMsg);
}
public void sendFace(Peer to, char code, String info, String face) {
P2PMessage newMsg = new P2PMessage(code, info, face, getMe(), to);
getDispatcher().dispatchToAll(newMsg);
}
public P2PConversation startP2PConversation(Peer iTo) {
if (iTo == null) {
return null;
}
P2PConversation convs = null;
if (prep2pconvs.containsKey(iTo)) {
convs = prep2pconvs.get(iTo);
} else {
convs = new P2PConversation(iTo);
prep2pconvs.put(iTo, convs);
}
return convs;
}
public void parseMessage(Message iMsg, String ip) {
if (iMsg == null)
return;
if (iMsg instanceof SystemMessage)// 系统消息解析
parseSystemMessage((SystemMessage) iMsg);
else if (iMsg instanceof RoomMessage)// 聊天室消息解析
parseChatRoomMessage((RoomMessage) iMsg);
else if (iMsg instanceof P2PMessage)// P2P消息解析
parseP2PMessage((P2PMessage) iMsg, ip);
else if (iMsg instanceof UserMessage)
parseUserMessage((UserMessage) iMsg);
else
System.out.println("bad message...");
}
public void parseUserMessage(UserMessage iMsg) {
char code = iMsg.getCode();
switch (code) {
case Const.CODE_LOGIN_FAIL:
synchronized (Const.waitForLoginAck) {
Const.waitForLoginAck.notify();
}
break;
case Const.CODE_LOGIN_SUCCESS:
me = iMsg.getFrom();
curRoom = new Room(me);
synchronized (Const.waitForLoginAck) {
Const.waitForLoginAck.notify();
}
break;
case Const.CODE_FORCE_PART:
javax.swing.JOptionPane.showMessageDialog(null, "您的账号在别处登录,强迫下线!",
"提示", javax.swing.JOptionPane.INFORMATION_MESSAGE);
UserRoomForm.getInstance(me).dispose();
break;
case Const.CODE_REGIST_FAIL:
synchronized (Const.waitForRegistAck) {
Const.waitForRegistAck.notify();
}
break;
case Const.CODE_REGIST_SUCCESS:
RegisterForm.getInstance(null).addNew(iMsg.getFrom());
synchronized (Const.waitForRegistAck) {
Const.waitForRegistAck.notify();
}
break;
case Const.CODE_SEARCH_RESULT:
SearchForm.getInstance(curRoom.getRoomForm()).addResult(
iMsg.getFrom().getFriends());
synchronized (Const.waitForSearchAck) {
Const.waitForSearchAck.notify();
}
break;
case Const.CODE_ADD_FRIEND:
UserRoomForm.getInstance(me).newFrndMsg(iMsg.getFrom());
break;
case Const.CODE_FRIEND_INFO:
UserRoomForm.getInstance(me).addFriend(iMsg.getFrom());
break;
case Const.CODE_DELETE_SUCCESS:
javax.swing.JOptionPane.showMessageDialog(null, "成功刪除好友!", "提示",
javax.swing.JOptionPane.INFORMATION_MESSAGE);
UserRoomForm.getInstance(me).delFriend(iMsg.getInfo());
break;
case Const.CODE_MODIFY_SUCCESS:
javax.swing.JOptionPane.showMessageDialog(null, "服务器已经接受了您的新资料!",
"提示", javax.swing.JOptionPane.INFORMATION_MESSAGE);
me.setName(iMsg.getInfo());
me.setGender(iMsg.getFrom().getGender());
UserRoomForm.getInstance(me).setTitle(
iMsg.getInfo() + "[" + me.getUserId() + "]");
break;
case Const.CODE_MODIFY_FAIL:
javax.swing.JOptionPane.showMessageDialog(null, "更新资料失败!", "提示",
javax.swing.JOptionPane.INFORMATION_MESSAGE);
break;
case Const.CODE_FIND_RESP:
FindPwdForm.getInstance(LoginForm.getInstance()).response();
break;
}
}
public Peer getMe() {
return me;
}
public java.util.TreeMap<Peer, P2PConversation> getP2PConvs() {
return prep2pconvs;
}
private void parseP2PMessage(P2PMessage iMsg, String ip) {
if (!getMe().equals(iMsg.getTo()))
return;
Peer peer = iMsg.getSender();
if (prep2pconvs.get(peer) != null && prep2pconvs.get(peer).isShutUp())
return;
P2PConversation p2pConvs = startP2PConversation(peer);
p2pConvs.show();
p2pConvs.msgArrival(iMsg, ip);
}
private void parseChatRoomMessage(RoomMessage iMsg) {
if (iMsg.getRoom() == null || !curRoom.equals(iMsg.getRoom()))
return;
curRoom.msgRecved(iMsg);
}
private void parseSystemMessage(SystemMessage iMsg) {
if (!iMsg.isBroadcast() && !iMsg.getToPeer().equals(getMe()))
return;
switch (iMsg.getCode()) {
case Const.CODE_ROOM_DISP:
if (!chatroomList.contains(iMsg.getArgument()))
chatroomList.add(iMsg.getArgument());
return;
case Const.CODE_JOIN_ROOM:
if (curRoom == null) {
reqRoom = iMsg.getArgument();
return;
} else {
if (!iMsg.getArgument().equals(curRoom.getName())) {
return;
}
curRoom.tellJoin(iMsg.getSender());
SystemMessage newMsg = new SystemMessage(getMe(),
Const.CODE_HELLO_JOIN, curRoom.getName());
getDispatcher().dispatchToAll(newMsg);
if (getMe().equals(curRoom.getAdmin())) {
newMsg = new SystemMessage(getMe(), Const.CODE_ROOM_ADMIN,
curRoom.getName());
getDispatcher().dispatchToAll(newMsg);
}
return;
}
case Const.CODE_HELLO_JOIN:
if (curRoom == null && reqRoom != null
&& reqRoom.equals(iMsg.getArgument())) {
Room room = new Room(iMsg.getArgument());
setAndMultiCastRoom(room);
synchronized (Const.waitForJoinAck) {
Const.waitForJoinAck.notify();
}
} else if (curRoom == null && reqRoom == null)
return;
if (!iMsg.getArgument().equals(curRoom.getName()))
return;
curRoom.addPeer(iMsg.getSender());
return;
case Const.CODE_LEFT_ROOM:
if (curRoom == null)
return;
if (!iMsg.getArgument().equals(curRoom.getName()))
return;
curRoom.left(iMsg.getSender());
return;
case Const.CODE_ROOM_ADMIN:
if (curRoom == null)
return;
if (!iMsg.getArgument().equals(curRoom.getName()))
return;
curRoom.setAdmin(iMsg.getSender());
return;
case Const.CODE_NICK_FREE:
if (getMe().getName().equals(iMsg.getArgument())
&& getMe().getStatus() == Const.STATUS_AUTH) {
SystemMessage newMsg = new SystemMessage(getMe(),
Const.CODE_NICK_TAKEN, getMe().getName());
getDispatcher().dispatchToAll(newMsg);
}
return;
case Const.CODE_ROOM_FREE:
if (Room.getByName(iMsg.getArgument()) != null
&& curRoom.getName().equals(iMsg.getArgument())) {
SystemMessage newMsg = new SystemMessage(getMe(),
Const.CODE_ROOM_TAKEN, iMsg.getArgument());
getDispatcher().dispatchToAll(newMsg);
}
return;
case Const.CODE_ROOM_TAKEN:
if (roomFree && reqRoom.equals(iMsg.getArgument())) {
roomFree = false;
try {
synchronized (Const.waitForNickAck) {
Const.waitForRoomAck.notify();
}
} catch (Exception e) {
}
}
return;
case Const.CODE_NICK_TAKEN:
if (getMe().getStatus() != Const.STATUS_ASK_NICK)
return;
getMe().setStatus(Const.STATUS_NICK_FAIL);
try {
synchronized (Const.waitForNickAck) {
Const.waitForNickAck.notify();
}
} catch (Exception e) {
}
return;
}
}
public void setReqRoom(String iRoom) {
reqRoom = iRoom;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -