wanghong19890301
wanghong19890301
采纳率100%
2016-07-07 12:41 阅读 1.9k
已采纳

局域网实时监控Socket通信问题

10

本人菜鸟,想实现局域网内,两个手机端的实时监控。现在图像是出来了,就是太卡了。一顿一顿的,基本无法用。我现在的方案是:手机摄像头端通过回调的方法拿到图片byte[],然后通过socket,tcp发送图片到另一个手机端。另一个手机端通过Imageview实现图片的显示,我是每s传20到30张图片。现在是有现象了,比较卡顿,求高手指点,哪里可以改善,或者有好的方案,可以给小弟指点一下,感激不尽

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    u011606457 _1_1_7_ 2016-07-08 01:57

    如果是传输数据卡,可以试试以下方案:
    调用设置Socket类的以下方法
    setReceiveBufferSize(int size)
    setSendBufferSize(int size)

    size大一些:1024*1024 *2 (2M)
    接收端和发送端设置一样的大小

    接收时,输入流用 new BufferedInputStream(socket.getInputStream());
    这样提升一下读性能

    点赞 评论 复制链接分享
  • oyljerry oyljerry 2016-07-07 13:10

    一个是手机显示视频的ImageView用一些第三方库。性能会好些。

    点赞 评论 复制链接分享
  • u011606457 _1_1_7_ 2016-07-07 15:06

    先要分析清楚是传输数据卡,还是显示图片卡?

    点赞 评论 复制链接分享
  • NK_test NK_test 2016-07-08 00:41

    要先判断瓶颈是在网络还是你本地的显示程序,你可以进行测试判断

    点赞 评论 复制链接分享
  • wanghong19890301 wanghong19890301 2016-07-08 01:36

    我不知道这样做对不对,方案是否可行,要是方案有问题,搞半天也搞不出来...还有就是图片的显示我用的是Bitmap bm = BitmapFactory.decodeByteArray(databuffer, 0, databuffer.length); 然后直接就把图片显示到Imageview了,这个应该是没啥问题的吧,我想主要是socket通信导致慢的

    点赞 评论 复制链接分享
  • wanghong19890301 wanghong19890301 2016-07-08 01:55

    我把我的核心代码贴出来:
    首先是摄像头的手机端:
    //将图像数据通过Socket发送出去
    Socket tempSocket = new Socket(ipname, 6000);
    outsocket = tempSocket.getOutputStream();
    byte[] bytes = myoutputstream.toByteArray();

    Log.d("CameraTest","bytes length : "+bytes.length);
    byte[] byteslen = intToBytes(bytes.length);
    byte[] bytesend = new byte[bytes.length+byteslen.length];
    Log.d("CameraTest","byte[]: "+Arrays.toString(byteslen));
    System.arraycopy(byteslen,0,bytesend,0,byteslen.length);
    System.arraycopy(bytes,0,bytesend,byteslen.length,bytes.length);

    ByteArrayInputStream inputstream = new ByteArrayInputStream(bytesend);
    int amount;
    while ((amount = inputstream.read(byteBuffer)) != -1) {
    Log.d("CameraTest","amount: "+amount);
    outsocket.write(byteBuffer, 0, amount);
    }
    myoutputstream.flush();
    myoutputstream.close();
    tempSocket.close();

                        接受视频数据的手机端:
                                                Socket socket = mServerSocket.accept();
                        Log.d(TAG, "client is connect!!!");
                        DataInputStream is = new DataInputStream(socket.getInputStream());
                        byte[] buffer = new byte[2048];
                        int slen = 0;
                        slen = is.read(buffer);
                        Log.d(TAG,"slen: "+slen);
                        byte[] bufferlen = new byte[4];
                        System.arraycopy(buffer,0,bufferlen,0,bufferlen.length);
                        Log.d(TAG,"bufferlen[]:"+Arrays.toString(bufferlen));
                        int size = bytesToInt(bufferlen,0);
                        Log.d(TAG,"len: "+size);
                        byte[] databuffer = new byte[size];
                        System.arraycopy(buffer,4,databuffer,0,(buffer.length-4));
                        int len = slen-4;
                        while(len < size){  
                            len += is.read(databuffer, len, size-len); 
                            Log.d(TAG, "len is : "+len);
                        }  
                        bm = BitmapFactory.decodeByteArray(databuffer, 0, databuffer.length);  
                        if(bm == null){                    
                        Log.i(TAG, "服务器:bitmap为空");  
                         }
                        handler.sendEmptyMessage(0x10);
    
    点赞 评论 复制链接分享

相关推荐