2013-05-18 72 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

相关问题