2013-05-18 73 views
2

我完全接收來自C# Server和流式視頻的Android中的圖像。問題是,我總是打開和關閉每個圖像的插座。我如何才能在僅創建一個套接字時接收圖像。任何幫助,將不勝感激。Android通過tcp socket從c#服務器接收圖像

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv=(TextView)findViewById(R.id.textView1); 
    etip=(EditText)findViewById(R.id.editText1); 
// etip.setText("192.168.1.5"); 
    etip.setText("10.0.2.2"); 
    imgview=(ImageView)findViewById(R.id.imageView1); 
    btn=(Button)findViewById(R.id.button1); 
    btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      try { 
      try { 
        serverAddr = InetAddress.getByName(etip.getText().toString()); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
        Log.d("TCP", "C: Connecting..."); 
      } 
      finally 
      { 

      } 
      try 
      { 
       { 
       mHandler = new Handler(); 
         mHandler.post(connectSocket); 
       }  

} 
      catch(Exception ex) 
      { 

      } 

     } 

    }); 
} 

    private Runnable connectSocket=new Runnable() { 

     @Override 
     public void run() { 

      { 
       try { 
       socket = new Socket(serverAddr, 4444); 
          DataInputStream dis; 
          try { 
           dis=new DataInputStream(socket.getInputStream()); 

           int bytesRead; 
           byte[] pic = new byte[5000*1024]; 
           bytesRead = dis.read(pic, 0, pic.length); 
           bitmapimage = BitmapFactory.decodeByteArray(pic, 0, bytesRead);    


          } catch(Exception e) { 
           Log.e("TCP", "S: Error", e); 
          } finally { 
           socket.close(); 
          } 

         } catch (UnknownHostException e) { 
          // TODO Auto-generated catch block 
          Log.e("TCP", "C: UnknownHostException", e); 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          Log.e("TCP", "C: IOException", e); 
          e.printStackTrace(); 
         } 
         imgview.setImageBitmap(bitmapimage); 
         imgview.invalidate(); 

    } 
      mHandler.postDelayed(this, 0); 
     } //run end 
    }; 


    } 

回答

0

插座將無法關閉,直到你告訴它關閉像

socket.close(); 

僅供參考,http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#close()套接字關閉功能也將關閉任何聯想輸入/輸出流

或線程/應用程序死亡。

爲了使應用程序/線程不斷等待和讀取,

http://docs.oracle.com/javase/6/docs/api/java/io/DataInputStream.html#read(字節[] )

從包含的輸入流中讀取一定數量的字節並將它們存儲到緩衝區數組b中。實際讀取的字節數作爲整數返回。此方法阻塞,直到輸入數據可用,檢測到文件結尾或引發異常。

使用循環內的inputstream的read函數,並讓它在有可用時讀取新數據。但是,我建議你儘量減少套接字連接的數量,通過限制最大的套接字連接等等。這可能會阻止一些攻擊者只想打開大量的套接字連接,而對你的服務器什麼都不做。

+0

我想在單個插槽上傳輸視頻,但我不知道如何做到這一點。如果你能指導我,我會非常感激 – waqasanwaar

+0

流式媒體可能相當困難,或者你可以用這種非常簡單的方式。但是,流式傳輸相當昂貴,因此如果此應用程序有意投放市場,您需要仔細規劃(架構服務器)。我建議你使用像Wowza這樣的流媒體服務器解決方案。這裏是他們的網站的教程http://www.wowza.com/forums/content.php?36-How-to-publish-and-play-a-live-stream-(RTMP-or-RTSP-RTP-基於編碼器) – Jason

+0

然後,你需要提供rtsp url,像rtsp://something.com到mediaview。這個過程很容易,因爲它已經內置於 – Jason

相關問題