[問題] java 1.6 vs 1.8 ssl socket連線問題

作者: JGC18 (JGC)   2015-03-26 11:34:25
各位好,我想請教一個java 1.6 vs 1.8的問題
我目前有一支程式要跟主機用SSL溝通,丟一些資料
底下是我連線,收送的部分
我在jre1.6環境下跑
不用disconnect,只要socket建通,直接write and read
不管送收幾次都可以
但是只要環境切到1.8下,第一次執行收送是成功的,
但只要在馬上執行一次同樣動作
主機那邊似乎就收到他們解碼不出來的東西,所以沒有回應我
我client就會timeout
我疑惑的是
"socket建立起來,第一次收送,成功正常,但socket沒有斷,只是再第二次送資料,結
果就是主機收到解不出來的東西"
不知道有沒有人可以給我一點方向去查問題呢
感謝回答
//connect
public boolean connect() {
logger.info("Start");
TrustManager[] trustManager = null;
SSLContext context = null;
try {
trustManager = new TrustManager [] {
(TrustManager) new MyX509TrustManager(CAFilePath,clentCertPath)
};
context = SSLContext.getInstance("SSL");
context.init(null, trustManager, null);
SocketFactory sf = context.getSocketFactory();
sslSocket = (SSLSocket) sf.createSocket(mUrl, mPort);
sslSocket.setSoTimeout(10*1000);//timeout 10 sec
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
logger.error(e1.getMessage());
}
if(sslSocket==null)
return false;
logger.info("sslSocket OK");
logger.info("end");
return true;
}
//收送
public String sendRequest(String req){
try {
if (sslSocket == null) {
//throw new IOException(ICMASResponse.scErr_NoConnection);
logger.error("SSL Socket NoConnection");
return null;
//throw new IOException("SSL Socket NoConnection");
}
OutputStream out= sslSocket.getOutputStream();
InputStream in = sslSocket.getInputStream();
out.write(req.getBytes("UTF-8"));
out.flush();
String resp = null;
int len = in.read(mBuffer);
if (len > 0) {
resp = new String(Arrays.copyOf(mBuffer, len), "UTF-8");
}
logger.info("resp:"+resp);
//out.close(); //!!Note: close() means closeSocket
//in.close(); //!!Note: close() means closeSocket
return resp;
} catch(IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
return null;
}
}
// main
public static void main(String args[])
{
logger.info("AP Start");
SSL ssl = null;
Properties logp = new Properties();
try {
logp.load(SSL_Test.class.getClassLoader().
getResourceAsStream("log4j.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String req = "<1100>000</1100><1200>999</1200>";
String resp = null;
ssl = new SSL("192.168.1.23",
7000,
null,
null);
if(!ssl.connect())
{
logger.info("connect fail");
return;
}
//no.1
resp = ssl.sendRequest(req);
logger.info("1st resp:"+resp);
//no.2
resp = ssl.sendRequest(req);
logger.info("2nd resp:"+resp);
//no.3
resp = ssl.sendRequest(req);
logger.info("3th resp:"+resp);
} catch (Exception e)
{
logger.error(e.getMessage());
e.printStackTrace();
}
finally{
ssl.disconnect();
}
}
作者: reon (Traveler)   2015-04-24 23:44:00
我沒用過1.8 但是Server端在收封包的時候 最好指定array大小

Links booklink

Contact Us: admin [ a t ] ucptt.com