Android通过tcp套接字从c#服务器接收图像

本文关键字:服务器 图像 通过 tcp 套接字 Android | 更新日期: 2023-09-27 18:14:17

我从C# Server和流媒体视频中完美地接收Android中的图像。问题是,我总是为每个图像打开和关闭socket。如何在创建一个套接字时接收图像?如有任何帮助,不胜感激。

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

    }

Android通过tcp套接字从c#服务器接收图像

除非您像

那样命令它关闭,否则套接字不会关闭。
socket.close();

供参考,http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#close() socket关闭函数也将关闭任何关联的输入/输出流

或者线程/应用程序死亡。

要使应用程序/线程不断等待和读取,

http://docs.oracle.com/javase/6/docs/api/java/io/DataInputStream.html阅读(byte [])

从包含的输入流中读取一定数量的字节,并将其存储到缓冲区数组b中。实际读取的字节数以整数形式返回。此方法阻塞,直到输入数据可用、检测到文件结束或抛出异常。

在循环中使用inputstream的read函数,并允许它在可用时读取新数据。

但是,我建议您通过限制最大套接字连接等方式尽可能地减少套接字连接的数量。这可以防止一些攻击者只是打开大量的套接字连接,而对您的服务器不做任何事情。