簡體   English   中英

Android通過C#服務器通過TCP套接字接收圖像

[英]Android receiving images over tcp socket from c# server

我可以從C# Server和流式視頻中完美接收Android圖像。 問題是,我總是為每個圖像打開和關閉插座。 如何僅在創建單個套接字時接收圖像。 任何幫助,將不勝感激。

@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
    };


    }

直到您告訴它關閉,插座才會關閉

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(byte [])

從包含的輸入流中讀取一定數量的字節,並將其存儲到緩沖區數組b中。 實際讀取的字節數以整數形式返回。 該方法將阻塞,直到輸入數據可用,檢測到文件結尾或引發異常為止。

在循環內使用inputstream的讀取功能,並使其在可用時讀取新數據。

但是,我建議您嘗試通過限制最大套接字連接數等來盡可能減少套接字連接數。這可能會阻止某些攻擊者僅打開大量套接字連接而對服務器不執行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM