错误: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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...