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