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

📄 service.java

📁 一个仿qq的程序源码 一个用纯java开发的
💻 JAVA
字号:
package qianqian.cschat;

import java.util.HashMap;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import qianqian.gui.Server;
import qianqian.p2pchat.constant.Const;

public class Service {
	private HashMap<String, String> users = new HashMap<String, String>();
	private static Service service;
	private Thread recvThread;
	private DatagramSocket dgmSocket;

	private class RecvThread extends Thread {
		private DatagramSocket udpSocket = null;

		public RecvThread(DatagramSocket iSock) {
			udpSocket = iSock;
		}

		public void run() {
			byte inBuf[] = new byte[Const.RecvBufSize];
			DatagramPacket recvPack = new DatagramPacket(inBuf,
					Const.RecvBufSize);
			try {
				while (!isInterrupted()) {
					udpSocket.receive(recvPack);
					dataReceived(recvPack.getData(), recvPack.getLength(),
							recvPack.getAddress());
				}
			} catch (Exception ex) {
			}
		}
	}

	private Service() {
		try {
			dgmSocket = new DatagramSocket(Const.SerPort);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (recvThread != null)
			recvThread.interrupt();
		recvThread = new RecvThread(dgmSocket);
		recvThread.start();
	}

	public static Service getInstance() {
		if (service == null) {
			synchronized (Service.class) {
				if (service == null)
					service = new Service();
			}
		}
		return service;
	}

	protected void dataReceived(byte[] iBuf, int iLen, InetAddress iAddr)
			throws Exception {
		Object msgIn = getMessage(iBuf, iLen);
		Message recMsg = (Message) msgIn;
		parseMessage(recMsg, iAddr);
	}

	protected void dispatch(byte iBuf[], int iSize, String iAddr)
			throws Exception {
		DatagramPacket disptchPack = new DatagramPacket(iBuf, iSize,
				InetAddress.getByName(iAddr), Const.CliPort);
		dgmSocket.send(disptchPack);
	}

	private Object getMessage(byte[] iBuf, int iLen) throws Exception {
		java.io.ByteArrayInputStream bIn = new java.io.ByteArrayInputStream(
				iBuf, 0, iLen);
		java.io.ObjectInputStream oiStream = new java.io.ObjectInputStream(bIn);
		Object msgIn = oiStream.readObject();
		oiStream.close();
		return msgIn;
	}

	private void sendMsg(Object iMsg, String iAddr) throws Exception {
		java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream();
		java.io.ObjectOutputStream ooStream = new java.io.ObjectOutputStream(
				bOut);
		ooStream.writeObject(iMsg);
		ooStream.close();
		byte[] bytes = bOut.toByteArray();
		dispatch(bytes, bytes.length, iAddr);
	}

	private synchronized void parseMessage(Message recMsg, InetAddress iAddr)
			throws Exception {
		char code = recMsg.getCode();
		switch (code) {
		case Const.CODE_USER_MSG:
			if (users.containsKey(recMsg.getTo())) {
				sendMsg(recMsg, users.get(recMsg.getTo()));
			} else {
				MessageManager.addMessage(recMsg.getTo(), recMsg.getFrom(),
						recMsg.getContent());
				Message msg = new Message(Const.CODE_SYSTEM_MSG,
						recMsg.getTo(), recMsg.getFrom(),
						"您的好友不在线,您所发消息自动保存到好友留言箱!");
				sendMsg(msg, iAddr.getHostName());
			}
			return;
		case Const.CODE_BOOK_MSG:
			String content = MessageManager.getMessage(recMsg.getFrom(), recMsg
					.getTo());
			if (content.isEmpty())
				content = "沒有任何留言!\n";
			Message msg = new Message(Const.CODE_BOOK_MSG, recMsg.getTo(),
					recMsg.getFrom(), content);
			sendMsg(msg, iAddr.getHostName());
			Server.getInstance().setLog("TCP:", iAddr.getHostAddress(), "Book");
			return;
		case Const.CODE_OFFLINE_MSG:
			users.remove(recMsg.getFrom());
			Server.getInstance().setLog("TCP:", iAddr.getHostAddress(),
					"Logout");
			return;
		case Const.CODE_ONLINE_MSG:
			users.put(recMsg.getFrom(), iAddr.getHostAddress());
			Server.getInstance()
					.setLog("TCP:", iAddr.getHostAddress(), "Login");
			return;
		}
	}

	public void quit() {
		if (dgmSocket != null) {
			dgmSocket.close();
			dgmSocket = null;
		}
		users.clear();
		recvThread.interrupt();
		service = null;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -