楼主要实现是要代码吗?
这个........
前不久我刚写过类似的东西。
接的时候是放ByteBuffer里,取的时候再分别取(你可以先取个名字,再取length,再根据length去图片数据)。
这就是写个接受协议。
楼主要是要代码的话,再说!建议自己写,以后用起来就不会忘。
另外提醒下楼主,在socket接受数据的时候,要注意带宽,即取buffer数据的时候要注意取到的长度。
不然会丢数据

解决方案 »

  1.   

    楼上说得不错,我从网上多番查找,终于找到了一点有用的例子了,写了下面这点代码,主要是获取文件名称和文件大小,但是并不能显示出来,求帮助啊!public void run(){
    byte[] temp = new byte[4096];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    char filename[]= new char[100];
    try{
    int length;
    while((length=in.read(temp))!= -1){
    buffer.write(temp, 0, length);
    System.out.println("gets: 2");
    }
    byte[] FileInfo = buffer.toByteArray();
    byte[] ByteFileName = new byte[100];
    byte[] ByteFileSize = new byte[4];
    byte[] ByteFileData = null;
    System.arraycopy(FileInfo, 0, ByteFileSize, 0, 4);
    System.out.println("gets: 3");
    System.arraycopy(FileInfo, 4, ByteFileName, 0, 100);
    //System.arraycopy(FileInfo, filename.length+4, ByteFileData, 0, FileInfo.length-(filename.length+4));
    String FileName = new String(ByteFileName).trim();
    System.out.println("FileName is:"+FileName);
    int FileSize = (ByteFileSize[0] & 0xff) | ((ByteFileSize[1] << 8) & 0xff00) // | 表示安位或   
    | ((ByteFileSize[2] << 24) >>> 8) | (ByteFileSize[3] << 24);
    System.out.println("FileSize is:"+FileSize);
    }catch(Exception e){
    e.printStackTrace();
    }


    }
      

  2.   

    可以接收图片的信息了,不过还是有两个问题:
    1.接收的文件名称后面带有乱码,接收的文件大小没错。
    2.在服务器断开连接我才收到这些信息(我在catch后面加上finally关闭通道都没能改正)。
      

  3.   

    谨慎怀疑是服务器给 char name[100]赋值之前没有初始化为0,所以导致你收到有乱码。
      

  4.   

    你出现乱码得原因是你接受的数据不全,socket(tcp/ip)发送数据是分片的。
    你这么接受数据会接受到部分数据,写的时候将分片考虑进去
      

  5.   

    FileName is:di36.bmp��￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾
    就是出现这种东西,不知道是不是乱码,怎么解决啊?￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾￾
      

  6.   

    int length;
                    while((length=in.read(temp))!= -1){
                        buffer.write(temp, 0, length);
                        System.out.println("gets: 2");
                    }
    你这样写,只能是有数据就取出来了。
    而不保证数据是不是完成
    你可以利用length来保证取到的数据够整包的时候再处理。还有一个问题
    你那边的具体的数据结构
    struct FileName{
      char name[100];//图片名称
      int length;//图片大小
      };
    到底是名称在前还是大小在前,你解析的时候,是前4个字节作为大小,再取100个字节作为名字的
    取得顺序要和发送端对上的
      

  7.   

    不是数据校验,而是保证数据完整。你将FileInfo数组的长度打出来,看下是不是你想接受的数据的总长度。
    如果这个长度小于104你的文件名打出来就有可能出错了
      

  8.   

    刚按你说的测试了下,FileInfo数组长度就等于104.没问题啊。
      

  9.   

    你打出来的这2个方格是网络数据填充你原始数据的原因,但为什么有这2个方格,没详细研究过,之前也见过类似的问题。
    有时间研究研究去。
    给你个地址,之前也有人遇到过这个问题。
    http://topic.csdn.net/t/20050917/20/4277180.html
      

  10.   

    终于搞好了。我把传过来的byte数组和转化为char的数组的每一个对应打印出来比较,发现出现的方格是byte编码0,我把它赋值-2(在java char下为空),所有没没。。这个应该是传过来的byte数组的尾巴问题吧,转换后才为方格。再次非常感谢你对小弟的讲解,谢谢!
      

  11.   

    能参考参考你的程序吗?我也是自定义协议,与VC服务器通信,但会报错。java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
    at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:589)
    at libcore.io.IoBridge.recvfrom(IoBridge.java:551)
    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:490)
    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
    at java.io.InputStream.read(InputStream.java:163)
    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:309)
    at com.example.imagesocketclient.ClientThread$1.run(ClientThread.java:108)
    Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
    07-22 10:31:29.362: W/System.err(5839):  at libcore.io.Posix.recvfromBytes(Native Method)
    07-22 10:31:29.362: W/System.err(5839):  at libcore.io.Posix.recvfrom(Posix.java:131)
    07-22 10:31:29.362: W/System.err(5839):  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
    07-22 10:31:29.362: W/System.err(5839):  at libcore.io.IoBridge.recvfrom(IoBridge.java:548)
    07-22 10:31:29.362: W/System.err(5839):  ... 7 more
    07-22 10:31:29.362: D/dalvikvm(5839): threadid=16: exiting