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

📄 dispatcher.java

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

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.Provider;
import java.security.Security;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import qianqian.p2pchat.constant.Const;
import qianqian.p2pchat.message.Message;
import qianqian.p2pchat.message.UserMessage;

public abstract class Dispatcher {
	private Cipher encCipher;
	private Cipher decCipher;
	SecretKeySpec keyIV;
	private PBEParameterSpec paramSpec;
	private SecretKey secretKey;

	private static byte[] salt = { (byte) 0xC9, (byte) 0x53, (byte) 0x67,
			(byte) 0x9A, (byte) 0x5B, (byte) 0xC8, (byte) 0xAE, (byte) 0x18 };

	public void setKey() throws Exception {
		Provider sunJce = new com.sun.crypto.provider.SunJCE();
		Security.addProvider(sunJce);
		paramSpec = new PBEParameterSpec(salt, 20);
		PBEKeySpec keySpec = new PBEKeySpec(Const.Key.toCharArray());
		SecretKeyFactory keyFactory = SecretKeyFactory
				.getInstance("PBEWithMD5AndDES");
		secretKey = keyFactory.generateSecret(keySpec);
		encCipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
		decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
	}

	protected Dispatcher() {
		try {
			encCipher = Cipher.getInstance("PBEWithMD5AndDES");
			decCipher = Cipher.getInstance("PBEWithMD5AndDES");
			setKey();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	protected abstract void dispatchToAll(byte[] iBuf, int iSize)
			throws Exception;

	protected void dispatchToAll(byte[] iBuf) throws Exception {
		dispatchToAll(iBuf, iBuf.length);
	}

	public void dispatchToAll(Message iMsg) {
		try {
			byte[] bOut = setMessage(iMsg);
			dispatchToAll(bOut);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	protected void dataReceived(byte[] iBuf, int iLen, String ip) {
		try {
			Object msgIn = getMessage(iBuf, iLen);
			Message recMsg = (Message) msgIn;
			Controller.getInstance().parseMessage(recMsg, ip);
		} catch (BadPaddingException ex) {
			try {
				decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
			} catch (Exception exc) {
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	protected abstract void dispatchToServer(byte[] iBuf, int iSize,
			String iAddr) throws Exception;

	protected void dispatchToServer(byte[] iBuf, String iAddr) throws Exception {
		dispatchToServer(iBuf, iBuf.length, iAddr);
	}

	public void dispatchToServer(UserMessage iMsg, String iAddr) {
		try {
			byte[] bOut = setMessage(iMsg);
			dispatchToServer(bOut, iAddr);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	private byte[] setMessage(Object iMsg) throws Exception {
		ByteArrayOutputStream bOut = new ByteArrayOutputStream();
		OutputStream underlayingStream = new CipherOutputStream(bOut,
				encCipher);
		ObjectOutputStream ooStream = new ObjectOutputStream(
				underlayingStream);
		ooStream.writeObject(iMsg);
		ooStream.close();
		
		return bOut.toByteArray();
	}
	
	private Object getMessage(byte[] iBuf, int iLen) throws Exception {
		byte[] outBuf = new byte[decCipher.getOutputSize(iLen)];
		iLen = decCipher.doFinal(iBuf, 0, iLen, outBuf, 0);
		ByteArrayInputStream bIn = new ByteArrayInputStream(outBuf, 0, iLen);
		ObjectInputStream ooStream = new ObjectInputStream(bIn);
		Object msgIn = ooStream.readObject();
		ooStream.close();
		
		return msgIn;
	}
	
	public abstract void closeDispatcher();
}

⌨️ 快捷键说明

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