⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controller.java

📁 一个仿qq的程序源码 一个用纯java开发的
💻 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 + -