黑马程序员技术交流社区

标题: Socket丢失字节问题? [打印本页]

作者: 一蓑烟雨任平生    时间: 2012-4-8 13:47
标题: Socket丢失字节问题?
import java.io.*;
import java.net.*;
class PicClient
{
        public static void main(String[] args)throws Exception
        {
                Socket s=new Socket("192.168.1.100",8001);
                BufferedInputStream fis=new BufferedInputStream(new FileInputStream("何洁 陈楚生 - 经过.mp3"));
                BufferedOutputStream os=new BufferedOutputStream(s.getOutputStream());
                int len=0;
                while((len=fis.read())!=-1)
                {
                        os.write(len);
                }
                s.shutdownOutput();
                InputStream is=s.getInputStream();
                byte[] buf=new byte[1024];
                len=is.read(buf);
                System.out.println(new String(buf,0,len));
                s.close();
        }
}
class PicServer
{
        public static void main(String[] args)throws Exception
        {
                ServerSocket ss=new ServerSocket(8001);
                Socket s=ss.accept();
                System.out.println(s.getInetAddress().getHostAddress());
                BufferedInputStream is=new BufferedInputStream(s.getInputStream());
                BufferedOutputStream fos=new BufferedOutputStream(new FileOutputStream("1.mp3"));
                int len=0;
                while((len=is.read())!=-1)
                {
                        fos.write(len);
                }
                OutputStream os=s.getOutputStream();
                os.write("上传成功!".getBytes());
                s.close();
                ss.close();
        }
}
原MP3是3,906,143 字节,传送完后的MP3是3,891,200 字节,数据在那里丢失的啊?
作者: 邓海涛    时间: 2012-4-8 14:11
这个问题比较有意思的,出问题的原因是:你忽略了图片,文本和音频数据在传输过程中都是以字节传输的,所以你最好用字节输入和输出流FileInputStream和FileOutputStream来传送,这样保证不会出错,你试试吧,我上次也是遇到这样的问题,有人告诉我用基本的字节输入输出流来做一定可以,我试了,结果真的是那样
作者: 一蓑烟雨任平生    时间: 2012-4-8 23:35
邓海涛 发表于 2012-4-8 14:11
这个问题比较有意思的,出问题的原因是:你忽略了图片,文本和音频数据在传输过程中都是以字节传输的,所以 ...

我用基本字节输入和输出做来,没问题,但一加缓冲区就出问题,郁闷。。。
作者: 申振华    时间: 2012-4-8 23:49
图片,音频等媒体文件都时二进制文件  所以需要使用字节流,而字符流操作的都是文本文件。
作者: 邓海涛    时间: 2012-4-9 09:57
一蓑烟雨任平生 发表于 2012-4-8 23:35
我用基本字节输入和输出做来,没问题,但一加缓冲区就出问题,郁闷。。。 ...


楼上兄弟说得很正确的,很多东西你只能用最基本的啊,不然就会出问题,原先我也一直也为加个缓冲区应该没问题啊,可是实践证明啊,只能用最基本的字节输入输出流进行读写
作者: pray    时间: 2014-4-26 05:36
让人半夜上厕所都要打开电脑再看一遍的好帖




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2