📄 dispatcher.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 + -