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

📄 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.net.InetAddress;
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 qianqian.p2pchat.constant.Const;
import qianqian.p2pchat.message.UserMessage;

public abstract class Dispatcher {
	private Cipher encCipher;
	private Cipher decCipher;
	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 };

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

	public abstract void closeDispatcher();

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

	protected void dispatchToClient(byte[] iBuf, InetAddress iAddr)
			throws Exception {
		dispatchToClient(iBuf, iBuf.length, iAddr);
	}
	
	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);
	}

	public void dispatchToClient(UserMessage iMsg, InetAddress iAddr) {
		try {
			byte[] bOut = setMessage(iMsg);
			dispatchToClient(bOut, iAddr);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	protected void dataReceived(byte[] iBuf, int iLen, InetAddress iAddr) {
		try {
			Object msgIn = getMessage(iBuf, iLen);
			UserMessage recMsg = (UserMessage) msgIn;
			Controller.getInstance().parseMessage(recMsg, iAddr);
		} catch (BadPaddingException ex) {
			try {
				decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
			} catch (Exception exc) {
			}
		} 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;
	}
}

⌨️ 快捷键说明

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