Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:java.io.IOException:流已关闭-HSM_Java_Spring_Sockets_Hsm - Fatal编程技术网

错误:java.io.IOException:流已关闭-HSM

错误: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){

我们使用套接字连接向HSM发送一个pin块进行加密和解密。 如下

 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的实例并获取输入或输出流?是的,我认为这就是导致此异常的原因,您可以尝试,如果这样做有效。。。