A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-5-7 00:59  /  1246 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ぺsimon☆ 于 2013-5-9 08:37 编辑
  1. /*
  2. 上传图片到服务器
  3. */

  4. import java.io.*;
  5. import java.net.*;

  6. class PicClient
  7. {
  8.         public static void main(String[] args)throws Exception
  9.         {
  10.         if(args.length!=1)//判断字符串数组长度是否为1
  11.         {
  12.         System.out.println("请选择一个jpg格式的图片");
  13.         return;
  14.         }

  15.         //把输入的路径封装成文件对象
  16.         File file=new File(args[0]);
  17.         //判断输入的路径是否存在和路径是否是文件
  18.         if(!(file.exists()&&file.isFile()))
  19.         {
  20.         System.out.println("该文件有问题,要么不存在,要么不是文件");
  21.         }

  22.         //判断文件格式为jpg
  23.         if(!file.getName().endsWith(".jpg"))
  24.         {
  25.         System.out.println("图片格式错误,请重新选择");
  26.         }

  27.         //判断文件大小
  28.         if(file.length()>1024*1024*5)
  29.         {
  30.         System.out.println("图片过大,没安好心");
  31.         }

  32.         //创建一个客户端的Socket
  33.         Socket s=new Socket("169.254.0.84",1006);
  34.         
  35.         //建立一个文件读取流,和文件对象相关联
  36.         FileInputStream fis=new FileInputStream(file);
  37.         //获取客户端Socket的网络字节输入流对象
  38.         InputStream fisin=s.getInputStream();
  39.         //获取客户端Socket的网络字节输出流对象
  40.         OutputStream fosout=s.getOutputStream();


  41.         byte[] buf=new byte[1024];//定义字节数组
  42.         int len=0;

  43.         //读取文件数据,并把数据写入Socket的网络输出流对象中
  44.         while((len=fis.read(buf))!=-1)
  45.         {
  46.         fosout.write(buf,0,len);
  47.         }
  48.         s.shutdownOutput();//写入结束标记

  49.         byte[] buf2=new byte[1024];
  50.         int len2=0;
  51.         //读取服务端反馈回来的信息
  52.         len2=fisin.read(buf2);
  53.         //把服务端反馈回来的信息打印在控制台
  54.         System.out.println(new String(buf2,0,len2));

  55.         fis.close();
  56.         s.close();
  57.         }
  58. }

  59. class PicThread implements Runnable //实现Runnable,定义多线程代码
  60. {
  61.         private Socket s;
  62.         PicThread(Socket s)
  63.         {
  64.         this.s=s;
  65.         }

  66.         public void run()
  67.         {
  68.         int count=1;
  69.         //获取客户端的ip地址
  70.         String ip=s.getInetAddress().getHostAddress();

  71.         try
  72.         {
  73.         //打印客户端的ip地址
  74.         System.out.println("connect..."+ip);
  75.         
  76.         //创建一个文件对象
  77.         File file=new File(ip+"("+(count)+")"+".jpg");

  78.         /*
  79.         注意:问题在这里!!!代码的本意是如果是同一个ip重复上传图片,文件名按照ip+"("+(count++)+")"+".jpg"来进行标记

  80.         问题1:
  81.         线程1作为第一个进来,读到count=1,创建了ip+(1).jpg的文件,然后线程2第二个进来,也读到count=1,也创建了ip+(1).jpg的文件,线程3进来,也是创建ip+(1).jpg的文件,这样的话每个线程进来都会创建这样的对象,这不是浪费资源吗,是这样吗?

  82.         问题2:
  83.         线程1作为第一个进来,读到count=1,创建了ip+(1).jpg的文件,然后线程2第二个进来,读到下面的判断语句,发现ip+(1).jpg的文件已经存在了,就创建ip+(2).jpg的文件,然后线程3进来,发现ip+(1).jpg的文件已经存在了,也是创建ip+(2).jpg的文件,是这样吗?如果是这样的话,count岂不是不超过2?真是不太明白...
  84.         */

  85.         while(file.exists())
  86.         {
  87.         file=new File(ip+"("+(count++)+")"+".jpg");
  88.         }

  89.         FileOutputStream fos=new FileOutputStream(file);
  90.         InputStream fisin=s.getInputStream();

  91.         byte[] buf=new byte[1024];
  92.         int len=0;

  93.         while((len=fisin.read(buf))!=-1)
  94.         {
  95.         fos.write(buf,0,len);
  96.         }

  97.         OutputStream fosout=s.getOutputStream();
  98.         fosout.write("上传图片成功".getBytes());

  99.         fos.close();
  100.         s.close();
  101.         }

  102.         catch(Exception e)
  103.         {
  104.         throw new RuntimeException("文件上传失败");
  105.         }
  106.         }
  107. }

  108. class PicServer
  109. {
  110.         public static void main(String[] args)throws Exception
  111.         {
  112.         ServerSocket ss=new ServerSocket(1006);
  113.         while(true)
  114.         {
  115.         Socket s=ss.accept();
  116.         new Thread(new PicThread(s)).start();
  117.         }
  118.         
  119.         
  120.         
  121.         //ss.close();
  122.         }
  123. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
  1. while(file.exists())

  2.         {

  3.         file=new File(ip+"("+(count++)+")"+".jpg");

  4.         }
  5. /*“2,然后线程3进来,发现ip+(1).jpg的文件已经存在了,也是创建ip+(2).jpg的文件,是这样吗?”

  6. 这里是一个while循环判断,知道判断到ip(*)不存在了,往下执行下去,如果你这里写的是if(file.exists()),那么你说的问题就会实现了;

  7. 再说了,new file(ip+"("+(count++)+")"+".jpg");,不会马上创建文件,只有执行到这一句 FileOutputStream fos = new FileOutputStream(file);才会创建文件。

  8. 1,你说的问题,的确有可能浪费资源。
  9. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢
回复 使用道具 举报
孙金鑫 发表于 2013-5-7 01:21

哦,知道了谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马