错误:java.io.IOException:流已关闭-HSM
我们使用套接字连接向HSM发送一个pin块进行加密和解密。 如下错误:java.io.IOException:流已关闭-HSM,java,spring,sockets,hsm,Java,Spring,Sockets,Hsm,我们使用套接字连接向HSM发送一个pin块进行加密和解密。 如下 public Socket clientSock; public OutputStream out; public BufferedOutputStream wr; public InputStream in; public BufferedInputStream rd; public String generateKeysFromHSM(Logger logger, String command){
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,0,temp_abc,0, header.length);
System.arraycopy(b,0,temp_abc,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;
}
阅读短袜
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().");
}
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, 0, 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, 0, 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
我们在同一时间获得相同方法的连续命中,甚至多个命中
在极少数情况下,我得到错误:java.io.IOException:Stream closed有人能帮我解决这个问题吗
谢谢。在我的一个代码中出现了这个异常,我发现的原因是,我只创建了我正在使用的流的一个实例,并且在工作完成后它将被关闭。由于我必须做的一些要求,我再次使用了同一个流实例,所以从技术上讲,这个实例在早期步骤中已经关闭,我试图再次使用它,因为出现了“流关闭”异常。为了解决这个问题,我创建了另一个stream实例并使用了它,而不是再次使用同一个实例。谢谢@Kumar。因此,在读写套接字方法中,如果clientSock关闭,那么我必须创建clientSock的实例并获取输入或输出流?是的,我认为这就是导致此异常的原因,您可以尝试,如果这样做有效。。。