黑马程序员技术交流社区

标题: 网络编程模拟客户端上传图片到服务器端出现了个问题找不着 [打印本页]

作者: 王士铭    时间: 2011-8-2 00:31
标题: 网络编程模拟客户端上传图片到服务器端出现了个问题找不着
网络编程模拟客户端上传图片到服务器端出现了个问题找不着,找了挺久都看不出什么错误,然后就重新写了一次成功了 可是这个类里面我到底是什么问题我一点都看不出来
UploadPic.java[code=java]import java.io.*;
import java.net.*;
class UploadPicClient
{
        public static void main(String args[])throws Exception
       
        {        if(args.length==0)
               
                {
                        System.out.println("请选择一个文件");
                        return;
                }
               
                File file=new File(args[0]);
                if(!(file.exists()&&file.isFile()&&file.getName().endsWith("jpg")))
                       
                {
                        System.out.println("请选择一个jpg的文件");
                        return ;
                }
                if(file.length()>4*1024*1204)
                       
                {
                        System.out.println("请选择一个小于4M的文件");
                        return ;
                }
                Socket s=new Socket("192.168.1.102",10001);
                FileInputStream fis=new FileInputStream(file);
                OutputStream outStream=s.getOutputStream();

                int len=0;
                byte buf[]=new byte[1024];
                while((fis.read(buf))!=-1)
                       
                {
                        outStream.write(buf,0,len);

                }
                s.shutdownOutput();
               
                InputStream inStream=s.getInputStream();
                int num=0;
                byte buffin[]=new byte[1024];
                num=inStream.read(buffin);
                String str=new String(buffin,0,num);
                System.out.println(str);

                fis.close();       

                s.close();
       
        }
}
class UploadServiceThread implements Runnable
{        private Socket s;
        public UploadServiceThread(Socket s)
               
        {
                this.s=s;       
        }
        public void run()
               
        {
                try
                {
                        String ip=s.getInetAddress().getHostAddress();

               
                        OutputStream outStream =s.getOutputStream();
                        InputStream inStream =s.getInputStream();
                        int count=1;
                        File file=new File(ip+"("+(count++) +")"+".jpg");
                        while(file.exists())
                               
                        {
                                file=new File(ip+"("+(count++) +")"+".jpg");
                        }
                        FileOutputStream fos =new FileOutputStream(file);
                        int len =0;
                        byte buff[]=new byte[1024];
                        while((len=inStream.read(buff))!=-1)
                               
                        {
                                fos.write(buff,0,len);
                        }
                        outStream.write("上传成功".getBytes());
                        fos.close();
                        s.close();
                }
                catch (Exception e)
                {
                        System.out.println(e.toString());
                }
        }
}
class UploadPicService
{
        public static void main(String args[])throws Exception
       
        {
                ServerSocket ss =new ServerSocket(10001);
               
                while(true)
                       
                {
                        Socket s=ss.accept();
                        new Thread(new UploadServiceThread(s)).start();
               
                }
        }
}[/code]
作者: 詹季春    时间: 2011-8-2 00:44
标题: 回复 楼主 的帖子
上面代码第33行 因为read()方法返回的是读取的:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。我们看下write()方法的API文档:
--------------------------------------
public void write(String s,
                  int off,
                  int len)
           throws IOException写入字符串的某一部分。
             如果 len 参数的值为负数,则不写入任何字符。这与超类中此方法的规范正好相反,它要求抛出IndexOutOfBoundsException。
            覆盖:
                 类 Writer 中的 write
          参数:
                 s - 要写入的字符串
                 off - 开始读取字符处的偏移量
                 len - 要写入的字符数
-----------------------------------------------------------
因为你没有获取read()方法返回的值,那么你在使用write()方法的时候传入的len还是0,结果你懂得[code=java]int len=0;
                byte buf[]=new byte[1024];
                while((fis.read(buf))!=-1)
                       
                {
                        outStream.write(buf,0,len);

                }[/code]这里是[code=java]while((len=fis.read(buf))!=-1)[/code]要不然后面的输出语句[code=java]outStream.write(buf,0,len);[/code]中的len还是0
[ 本帖最后由 詹季春 于 2011-08-02  00:58 编辑 ]
作者: 匿名    时间: 2011-8-2 11:06
标题: 回复 沙发 的帖子
:lol 感谢版主了,早上醒来想了一下,没法得到图片就想到应该是在输出流里面出来问题,没想到版主这么快就把问题解决了




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