2012-04-11 65 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如果另一端關閉套接字。當套接字處於活動狀態時,該呼叫將阻塞,直到有更多數據可用。

你需要做的是改變你的「協議」:客戶端應該首先發送數組大小,然後發送數據。服務器應該讀取該長度,並在完成後停止讀取文件(回到等待下一個文件)。

相關問題