2014-02-21 3 views
-1

У меня есть TCP-сервер, который принимает данные и сохраняет их в текстовый файл. Затем он использует этот текстовый файл для создания изображения и отправляет его клиенту. Каждые пару часов я получаю NullPointerException, который будет передан каждому клиенту, который подключится после этого. Я не уверен, как это сделать, поскольку я не могу воспроизвести его самостоятельно.Блокирование многопоточного TCP-сервера NullPointerException отладки

Есть ли у кого-нибудь какие-либо методы отладки, которые помогут мне понять, почему это становится проблемой?

Сервер работает под управлением Ubuntu 12.04 i386 с 2 гигабайтами оперативной памяти. Мое первоначальное подозрение в том, что что-то не закрывается должным образом и создает проблемы, но все должно быть закрыто, насколько я могу судить.

ServerSocket echoServer = null; 
    Socket clientSocket = null; 
    try { 
     echoServer = new ServerSocket(xxx); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 

    while(true) 
    { 
      InputStream is = null; 
      FileOutputStream fos = null; 
      BufferedOutputStream bos = null; 
      int bufferSize = 0; 
      FileInputStream fis = null; 
      BufferedInputStream bis = null; 
      BufferedOutputStream out = null; 
     try { 

      //Receieve text file 
      is = null; 
      fos = null; 
      bos = null; 
      bufferSize = 0; 
      String uid = createUid(); 

      try { 
       clientSocket = echoServer.accept(); 
       clientSocket.setKeepAlive(true); 
       clientSocket.setSoTimeout(10000); 
       System.out.println("Client accepted from: " + clientSocket.getInetAddress()); 
      } catch (IOException ex) { 
       System.out.println("Can't accept client connection. "); 
      } 

      try { 
       is = clientSocket.getInputStream(); 
       bufferSize = clientSocket.getReceiveBufferSize(); 
       System.out.println("Buffer size: " + bufferSize); 
      } catch (IOException ex) { 
       System.out.println("Can't get socket input stream. "); 
      } 

      try { 
       fos = new FileOutputStream("/my/diretory/" + uid + ".txt"); 
       bos = new BufferedOutputStream(fos); 

      } catch (FileNotFoundException ex) { 
       System.out.println("File not found. "); 
      } 

      byte[] bytes = new byte[bufferSize]; 

      int count; 

      while ((count = is.read(bytes)) > 0) { 
       bos.write(bytes, 0, count); 
       System.out.println("Receiving... " + count); 
      } 

      System.out.println("Done receiving text file"); 
      bos.flush(); 
      bos.close(); 
      fos.close(); 

      //image 
      String[] command = new String[3]; 
      command[0] = "python"; 
      command[1] = "imagecreationfile.py"; 
      command[2] = uid; 
      System.out.println("Starting python script"); 
      Boolean success = startScript(command); 
      if(success) 
      { 
       System.out.println("Script completed successfully"); 
       //Send image here 
       String image = "/my/directory/" + uid + ".png"; 
       File imageFile = new File(image); 
       long length = imageFile.length(); 
       if (length > Integer.MAX_VALUE) { 
        System.out.println("File is too large."); 
       } 

       bytes = new byte[(int) length]; 
       fis = new FileInputStream(imageFile); 
       bis = new BufferedInputStream(fis); 
       out = new BufferedOutputStream(clientSocket.getOutputStream()); 

       count = 0; 
       while ((count = bis.read(bytes)) > 0) { 
        out.write(bytes, 0, count); 
        System.out.println("Writing... " + count); 
       } 

       out.flush(); 
       out.close(); 
       fis.close(); 
       bis.close(); 
      } 
      else 
      { 
       System.out.println("Script failed"); 
      } 


      System.out.println("Closing connection"); 
      is.close(); 
      clientSocket.close(); 
     } catch (Exception e) { 
      System.out.println(e); //This is where the exception is being caught 

     } 

     if(!clientSocket.isClosed()) 
     { 
      try { 
       clientSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     try { 
     if(is != null) 
      is.close(); 

     if(fos != null) 
      fos.close(); 

     if(bos != null) 
      bos.close(); 

     if(fis != null) 
      fis.close(); 

     if(bis != null) 
      bis.close(); 

     if(out != null) 
      out.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

Опубликовать трассировку стека и определить, какая строка источника выбрасывает исключение. Без этого это всего лишь игра с угадыванием. – EJP

+0

Ответ в обоих случаях одинаковый. Получить трассировку стека. Вы ничего не можете сделать без него, и как только у вас это будет, решение будет очевидно. – EJP

ответ

1

Возможно, исключение было выбрано в одном из ваших зон пробных ловушек. И в следующей области try-catch обнаружены нулевые переменные.

, например

//Receieve text file 
     is = null; 
     fos = null; 
     bos = null; 
     bufferSize = 0; 
     String uid = createUid(); 

     try { 
      clientSocket = echoServer.accept(); 
      clientSocket.setKeepAlive(true); 
      clientSocket.setSoTimeout(10000); 
      System.out.println("Client accepted from: " + clientSocket.getInetAddress()); 
     } catch (IOException ex) { 
      System.out.println("Can't accept client connection. "); 
     } 

     try { 
      is = clientSocket.getInputStream(); 
      bufferSize = clientSocket.getReceiveBufferSize(); 
      System.out.println("Buffer size: " + bufferSize); 
     } catch (IOException ex) { 
      System.out.println("Can't get socket input stream. "); 
     } 

, если IOException был брошен в "ClientSocket = echoServer.accept();" , он напечатает сообщение «Не удается принять клиентское соединение». Когда "is = clientSocket.getInputStream();" выполненный, он будет вызывать NullPointer, потому что «clientSocket» не был инициализирован должным образом. Мое предложение, не разрывайте секвенсорный оператор в разных областях try-catch до тех пор, пока это не понадобится.

Смежные вопросы