如何解决错误:java.io.IOException:流关闭-HSM
我们发送一个插针块,以使用套接字连接对HSM进行加密和解密。 如下
public Socket clientSock;
public OutputStream out;
public bufferedoutputstream wr;
public InputStream in;
public BufferedInputStream rd;
public String generateKeysFromHSM(Logger logger,String command){
logger.info("Start - sendCommandToHSM().");
String result = null;
String temp;
try
{
String inLine = command;
logger.info("command = "+inLine);
System.out.println("************************************************");
System.out.println("Read Value From File: " + inLine);
int k[] = new int[(inLine.length())/2];
byte b[] = new byte[(inLine.length())/2];
byte header[] = new byte[6]; //EFT Header
byte[] length = new byte[2]; //Length of Data
for(int i=0,l=0;i<inLine.length();i=i+2,L++)
{
temp = inLine.substring(i,i+2);
k[l] = Integer.parseInt(temp,16);
b[l] = (byte) k[l];
//System.out.println("fileArray[" + l + "] = " +b[l] );
}
String hexString = Integer.toHexString(b.length);
if (b.length<=255)
{
length[0] = 0x00;
length[1] = new BigInteger(hexString,16).byteValue();
}
else
{
length = new BigInteger(hexString,16).toByteArray();
}
header[0] = 0x01;
header[1] = 0x01;
header[2] = 0x00;
header[3] = 0x00;
header[4] = length[0];
header[5] = length[1];
System.out.println("Number of Data BYTES : " +(b.length));
System.out.println("Length of the Request: " +hexString);
logger.info("Number of Data BYTES : " +(b.length));
logger.info("Length of the Request: " +hexString);
//System.out.println("Hex Value of Input Stream: " +bytesToHexStr(b));
/* Concatenating EFT Header and File Data */
byte[] temp_abc = new byte[header.length + b.length];
System.arraycopy(header,temp_abc,header.length);
System.arraycopy(b,header.length,b.length);
header = temp_abc;
int i=0;
while(i<2)
{
//System.out.println("Input to EFT: " +bytesToHexStr(header));
i++;
/*
* if(inputStream != null){ inputStream.close(); }
*/
logger.info("hsm IP = "+filesUtil.getProperty("hsmIp")+",port = "+filesUtil.getProperty("hsmPort"));
clientSock = new Socket(filesUtil.getProperty("hsmIp"),Integer.parseInt(filesUtil.getProperty("hsmPort")));
write_sock(header,clientSock,logger);
result = read_sock(logger,clientSock);
out.close();
wr.close();
in.close();
rd.close();
clientSock.close();
}
}
catch(UnkNownHostException e)
{
logger.info((new StringBuilder()).append("Error :").append(e).toString());
logger.error("Exception in sendCommandToHSM : ",e);
e.printstacktrace();
result = e.getMessage();
System.out.println("UnkNownHostException:");
System.out.println((new StringBuilder()).append("Error :").append(e).toString());
}
catch (IOException e)
{
logger.info((new StringBuilder()).append("Error :").append(e).toString());
logger.error("Exception in sendCommandToHSM : ",e);
e.printstacktrace();
result = e.getMessage();
System.out.println("IOException:");
System.out.println((new StringBuilder()).append("Error :").append(e).toString());
}
logger.info("result = "+result);
logger.info("End - sendCommandToHSM().");
return result;
}
read()和write()方法
write_sock
public void write_sock(byte bt_req[],Socket clientSock,Logger logger) {
logger.info("Start - write_sock().");
try
{
out = clientSock.getoutputStream();
wr = new bufferedoutputstream(out);
System.out.println((new StringBuilder()).append("Request being sent to EFT is: ").append(bytesToHexStr(bt_req)).toString());
logger.info((new StringBuilder()).append("Request being sent to EFT is: ").append(bytesToHexStr(bt_req)).toString());
wr.write(bt_req);
wr.flush();
}
catch(IOException e)
{
e.printstacktrace();
System.out.println((new StringBuilder()).append("Error :").append(e).toString());
logger.info((new StringBuilder()).append("Error :").append(e).toString());
logger.error("Exception in write_sock() : ",e);
}
logger.info("End - write_sock().");
}
read_sock
public String read_sock(Logger logger,Socket clientSock){
String result = null;
logger.info("Start - read_sock().");
try
{
// int rv = 0;
byte eracom_header[] = new byte[6];
byte len_prefix[] = new byte[2];
int length_of_response = 0;
in = clientSock.getInputStream();
rd = new BufferedInputStream(in);
rd.read(eracom_header,6);
System.out.println((new StringBuilder()).append("EFT Header is: ").append(bytesToHexStr(eracom_header)).toString());
logger.info((new StringBuilder()).append("EFT Header is: ").append(bytesToHexStr(eracom_header)).toString());
len_prefix[0] = eracom_header[4];
len_prefix[1] = eracom_header[5];
length_of_response = bytetoInt(len_prefix,logger);
System.out.println((new StringBuilder()).append("Length of the Response: ").append(length_of_response).toString());
logger.info((new StringBuilder()).append("Length of the Response: ").append(length_of_response).toString());
byte read_buf[] = new byte[length_of_response];
rd.read(read_buf,length_of_response);
String resp_str = bytesToHexStr(read_buf);
System.out.println((new StringBuilder()).append("Output Received from the EFT: ").append(resp_str).toString());
System.out.println("************************************************");
logger.info((new StringBuilder()).append("Output Received from the EFT: ").append(resp_str).toString());
logger.info("************************************************");
result = resp_str;
}
catch(IOException e)
{
System.out.println((new StringBuilder()).append("Error :").append(e).toString());
logger.info((new StringBuilder()).append("Error :").append(e).toString());
logger.error("Exception in read_sock()",e);
result = e.getMessage();
}
logger.info("result = "+result);
logger.info("End - read_sock().");
return result;
}
问题是
Error :java.io.IOException: Stream closed
java.net.socketException: Socket is closed
at java.net.socket.getoutputStream(Socket.java:917)
at com.apptmyz.fpcardapp.utils.HsmOperations.write_sock(HsmOperations.java:273)
at com.apptmyz.fpcardapp.utils.HsmOperations.generateKeysFromHSM(HsmOperations.java:226)
at com.apptmyz.fpcardapp.controller.CashWithdrawalController.cashWithdrawalRequest(CashWithdrawalController.java:225)
at sun.reflect.GeneratedMethodAccessor203.invoke(UnkNown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.invocableHandlerMethod.doInvoke(invocableHandlerMethod.java:205)
at org.springframework.web.method.support.invocableHandlerMethod.invokeForRequest(invocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletinvocableHandlerMethod.invokeAndHandle(ServletinvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mv
对于同一方法generateKeys,即使是同时发生多种匹配,我们也会得到连续的匹配。
在极少数情况下,我会收到错误:java.io.IOException:流关闭可以帮上忙。
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。