2012-04-11 2 views
0

У меня есть программа, которая принимает соединение с телефоном, который отправляет массив байтов, я могу проверить соединение, когда оно сделано, однако как я знаю, что я действительно что-то получаю? как я могу «видеть», если какая-либо вещь отправляется через сокет. Потому что из моего кода ниже я не могу создать полученный файл «saved.jpg». Означает ли это, что ничего не получило?Получение байтового массива через сокет

public class wpsServer { 

    //vars 
    private int svrPort = 3334; 
    private ServerSocket serverSocket; 
    private Image image = null; 

    public wpsServer() 
    { 
     try { 
      serverSocket = new ServerSocket(svrPort); 
      System.out.println("Server started on "+svrPort); 
     } 
     catch (IOException e) { 
      System.out.println("Could not listen on port: "+svrPort); 
      System.exit(-1); 
     } 
    } 

    public void listenForClient() 
    { 
     Socket clientSocket = null; 
     try { 
      clientSocket = serverSocket.accept(); 
      if(clientSocket.isConnected()) 
       System.out.println("Connected"); 

      byte[] pic = getPicture(clientSocket.getInputStream()); 
      InputStream in = new ByteArrayInputStream(pic); 
      BufferedImage image = ImageIO.read(in); 
      File outputfile = new File("saved.jpg"); 
      ImageIO.write(image, "jpg", outputfile); 

     } 
     catch (IOException e) { 

      System.out.println("Accept failed: "+svrPort); 
      System.exit(-1); 
     } 

    } 

    public byte[] getPicture(InputStream in) { 
      try { 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      byte[] data = new byte[1024]; 
      int length = 0; 
      while ((length = in.read(data))!=-1) { 
       out.write(data,0,length); 
      } 
       return out.toByteArray(); 
      } catch(IOException ioe) { 
      //handle it 
      } 
      return null; 
     } 

} 

ответ

0

in.read вызов будет возвращать только -1 если другой конец закрывает сокет. Пока сокет жив, этот вызов блокируется до тех пор, пока не будет доступно больше данных.

Что вам нужно сделать, это изменить свой «протокол»: клиент должен сначала отправить размер массива, а затем данные. Сервер должен прочитать эту длину и прекратить чтение файла, когда это будет сделано (вернитесь к ожиданию следующего файла, например).

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