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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李跃达 中级黑马   /  2013-1-30 15:33  /  1510 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李跃达 于 2013-1-31 00:18 编辑
  1. /*
  2. 需求:上传图片。



  3. */
  4. /*
  5. 客户端。
  6. 1,服务端点。
  7. 2,读取客户端已有的图片数据。
  8. 3,通过socket 输出流将数据发给服务端。
  9. 4,读取服务端反馈信息。
  10. 5,关闭。

  11. */

  12. import java.io.*;
  13. import java.net.*;
  14. class  PicClient
  15. {
  16.         public static void main(String[] args)throws Exception
  17.         {
  18.                 if(args.length!=1)
  19.                 {
  20.                         System.out.println("请选择一个jpg格式的图片");
  21.                         return ;
  22.                 }




  23.                 File file = new File(args[0]);
  24.                 if(!(file.exists() && file.isFile()))
  25.                 {
  26.                         System.out.println("该文件有问题,要么补存在,要么不是文件");
  27.                         return ;

  28.                 }

  29.                 if(!file.getName().endsWith(".jpg"))
  30.                 {
  31.                         System.out.println("图片格式错误,请重新选择");
  32.                         return ;
  33.                 }

  34.                 if(file.length()>1024*1024*5)
  35.                 {
  36.                         System.out.println("文件过大,没安好心");
  37.                         return ;
  38.                 }
  39.                



  40.                 Socket s = new Socket("192.168.1.254",10007);

  41.                 FileInputStream fis = new FileInputStream(file);

  42.                 OutputStream out = s.getOutputStream();

  43.                 byte[] buf = new byte[1024];

  44.                 int len = 0;

  45.                 while((len=fis.read(buf))!=-1)
  46.                 {
  47.                         out.write(buf,0,len);
  48.                 }

  49.                 //告诉服务端数据已写完
  50.                 s.shutdownOutput();

  51.                 InputStream in = s.getInputStream();

  52.                 byte[] bufIn = new byte[1024];

  53.                 int num = in.read(bufIn);
  54.                 System.out.println(new String(bufIn,0,num));

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

  59. /*
  60. 服务端

  61. 这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
  62. 这时B客户端连接,只有等待。
  63. 因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
  64. 暂时获取不到B客户端对象。

  65. 那么为了可以让多个客户端同时并发访问服务端。
  66. 那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。



  67. 如何定义线程呢?

  68. 只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。
  69. */

  70. class PicThread implements Runnable
  71. {

  72.         private Socket s;
  73.         PicThread(Socket s)
  74.         {
  75.                 this.s = s;
  76.         }
  77.         public void run()
  78.         {

  79.                 int count = 1;
  80.                 String ip  = s.getInetAddress().getHostAddress();
  81.                 try
  82.                 {
  83.                         System.out.println(ip+"....connected");

  84.                         InputStream in = s.getInputStream();

  85.                         File dir =  new File("d:\\pic");

  86.                         File file = new File(dir,ip+"("+(count)+")"+".jpg");//这里count==1
  87.                                                                                                                    //等于创建了1号文件

  88.                         while(file.exists())
  89.                                 file = new File(dir,ip+"("+(count++)+")"+".jpg");
  90.                                                                 //这里count++不是也创建了1号文件么?加过之后count
  91.                                                                 //count不是才等于2么?为什么这个程序运行起来却没有
  92.                                           //出现文件覆盖的情况呢?
  93.                         FileOutputStream fos = new FileOutputStream(file);

  94.                         byte[] buf = new byte[1024];

  95.                         int len = 0;
  96.                         while((len=in.read(buf))!=-1)
  97.                         {
  98.                                 fos.write(buf,0,len);
  99.                         }

  100.                         OutputStream out = s.getOutputStream();

  101.                         out.write("上传成功".getBytes());

  102.                         fos.close();

  103.                         s.close();
  104.                 }
  105.                 catch (Exception e)
  106.                 {
  107.                         throw new RuntimeException(ip+"上传失败");
  108.                 }
  109.         }
  110. }



  111. class  PicServer
  112. {
  113.         public static void main(String[] args) throws Exception
  114.         {
  115.                 ServerSocket ss = new ServerSocket(10007);

  116.                 while(true)
  117.                 {
  118.                         Socket s = ss.accept();

  119.                         new Thread(new PicThread(s)).start();

  120.                
  121.                 }

  122.                 //ss.close();
  123.         }
  124. }
  125. <FONT size=6>问题见124行
  126. </FONT>
复制代码

6 个回复

倒序浏览
呵呵,你没见那句话前面是个while循环吗?那个循环就是当文件存在的时候才执行那句话,直到文件不存在为止.所以不会覆盖.
在new File对象的时候并不会创建文件.
回复 使用道具 举报
杨玲 发表于 2013-1-30 17:32
呵呵,你没见那句话前面是个while循环吗?那个循环就是当文件存在的时候才执行那句话,直到文件不存在为止.所 ...

亲你根本没看懂我问的是什么,如果进入循环,count++==1,而不是2就把之前的1覆盖了
回复 使用道具 举报
李跃达 发表于 2013-1-30 18:10
亲你根本没看懂我问的是什么,如果进入循环,count++==1,而不是2就把之前的1覆盖了 ...

我说哥们,new File对象是不会创建文件的,真正创建文件的是后面的步骤呀!
回复 使用道具 举报
杨玲 发表于 2013-1-30 21:14
我说哥们,new File对象是不会创建文件的,真正创建文件的是后面的步骤呀!

就是不创建,之前写到那个文件中的东西也会被覆盖的
回复 使用道具 举报
李跃达 发表于 2013-1-30 22:29
就是不创建,之前写到那个文件中的东西也会被覆盖的

呵呵,难道你的File对象特殊点?File对象只是一个文件对象,只有当你调用它的创建对象的方法或者是与流相关联了以后它才会创建文件.而覆盖发生在创建文件的时候,如果连new个 File对象也要覆盖那就神了奇了,
回复 使用道具 举报
杨玲 发表于 2013-1-30 23:55
呵呵,难道你的File对象特殊点?File对象只是一个文件对象,只有当你调用它的创建对象的方法或者是与流相关 ...

关键是它除了穿件文件夹之外还有上传一张图片,就是不创建,往1号文件里面上传两次图片,第二次不会把第一次覆盖么
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马