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

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

6个回答

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

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

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

wanghong19890301
wanghong19890301 OK,我现在的做法是把字节长度直接放在BYTE[]数组一起发,解析相对复杂,谢谢你,我再试一试
大约 4 年之前 回复
u011606457
_1_1_7_ 长度的int变量先转为4个字节的byte[],然后先发送这4字节,(可以调用输出流的flush方法)再发送byte[]图片数据
大约 4 年之前 回复
wanghong19890301
wanghong19890301 回复_1_1_7_: 好的,我试一下,还有一个问题,如果我发送一张图片的BYTE[],咋样把byte[]字节长度先发送过去呢
大约 4 年之前 回复
u011606457
_1_1_7_ new DataInputStream(new BufferedInputStream(socket.getInputStream()));
大约 4 年之前 回复

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

wanghong19890301
wanghong19890301 局域网内视频通信会不会是socket的原因导致的?
大约 4 年之前 回复

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

wanghong19890301
wanghong19890301 大牛,怎么分析,给点思路撒
大约 4 年之前 回复

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

wanghong19890301
wanghong19890301 如何测试判断,大牛
大约 4 年之前 回复

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

我把我的核心代码贴出来:
首先是摄像头的手机端:
//将图像数据通过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);
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问