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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴上储 黑马帝   /  2011-12-11 22:40  /  1935 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴上储 于 2011-12-12 10:40 编辑

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;

  8. /*
  9. * 需求:上传图片
  10. */

  11. /*
  12. * 客户端:
  13. * 1、服务端点
  14. * 2、读取客户端已有的图片数据
  15. * 3、通过socket输出流将数据发给服务端
  16. * 4、读取服务端反馈信息
  17. * 5、关闭
  18. *
  19. */
  20. class PicClient {

  21.         public static void main(String[] args)throws Exception {
  22.                 if(args.length != 1)
  23.                 {
  24.                         System.out.println("请选择一个jpg格式的图片");
  25.                         return;
  26.                 }
  27.                 File file = new File(args[0]);
  28.                 if(!(file.exists() && file.isFile()))
  29.                 {
  30.                         System.out.println("该文件有问题,要么不存在,要么不是文件");
  31.                         return;
  32.                 }
  33.                 if(!file.getName().endsWith(".jpg"))
  34.                 {
  35.                         System.out.println("图片格式错误,请重新选择");
  36.                         return;
  37.                 }
  38.                 if(file.length()>1024*1024*5)
  39.                 {
  40.                         System.out.println("文件太大了,我放不下");
  41.                         return;
  42.                 }
  43.                
  44.                
  45.                
  46.                
  47.                 Socket s = new Socket("127.0.0.1",10007);
  48.                 FileInputStream fis = new FileInputStream(file);
  49.                
  50.                 OutputStream out = s.getOutputStream();
  51.                
  52.                 byte[] buf = new byte[1024];
  53.                
  54.                 int len = 0;
  55.                 while((len = fis.read(buf)) != -1)
  56.                 {
  57.                         out.write(buf,0,len);
  58.                 }
  59.                 //告诉服务端数据已写完
  60.                 s.shutdownOutput();
  61.                
  62.                 InputStream in = s.getInputStream();
  63.                
  64.                 byte[] bufIn = new byte[1024];
  65.                
  66.                 int num = in.read(bufIn);
  67.                 System.out.println(new String(bufIn,0,num));
  68.                 fis.close();
  69.                 s.close();
  70.                
  71.         }
  72. }
  73. /*
  74. * 服务端
  75. *
  76. * 这个服务端有个局限性,当A客户端连接上以后,被服务端获取到,服务端执行具体流程
  77. * 这时B客户端连接。只有等待
  78. * 因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法,所以
  79. * 暂时获取不到B客户端对象。
  80. * 那么为了可以让多个客户端同时访问服务端。
  81. * 那么服役端最好就是将每个客户端封装到单独的线程中,这样就可以同时处理多个客户端请求
  82. *
  83. * 如何定义线程呢?
  84. *
  85. * 只要明确了每一个客户端要在服务端执行的代码时,即可,将该 代码存入run方法中。
  86. */
  87. class PicThread implements Runnable
  88. {        private Socket s;
  89.         PicThread(Socket s) {
  90.                 this.s = s;
  91.         }
  92.         public void run() {
  93.                 String ip = s.getInetAddress().getHostAddress();
  94.                 try {
  95.                         int count = 1;
  96.                         System.out.println(ip+"...connected");
  97.                         InputStream in = s.getInputStream();
  98.                        
  99.                         File file = new File(ip+"("+count+")"+".jpg");
  100.                        
  101.                         while(file.exists())
  102.                                 file = new File(ip+"("+(count++)+")"+".jpg");
  103.                        
  104.                        
  105.                         FileOutputStream fos = new FileOutputStream(file);
  106.                        
  107.                         byte[] buf = new byte[1024];
  108.                        
  109.                         int len = 0;
  110.                         while((len = in.read(buf)) != -1)
  111.                         {
  112.                                 fos.write(buf,0,len);
  113.                         }
  114.                        
  115.                         OutputStream out = s.getOutputStream();
  116.                         out.write("上传成功".getBytes());
  117.                        
  118.                         fos.close();
  119.                        
  120.                         s.close();
  121.                 } catch (Exception e) {
  122.                         throw new RuntimeException(ip+"上传失败");
  123.                 }
  124.                
  125.         }
  126. }
  127. class PicServer{
  128.        
  129.         public static void main(String[] args)throws Exception  {
  130.                 ServerSocket ss = new ServerSocket(10007);
  131.                 while(true){
  132.                 Socket s = ss.accept();
  133.                 new Thread(new PicThread(s)).start();
  134.                
  135.                 }
  136.                 //ss.close();
  137.         }
  138. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 侯伟浩 于 2011-12-12 10:24 编辑

解释客户端:
25.                if(args.length != 1)

26.                {

27.                        System.out.println("请选择一个jpg格式的图片");

28.                        return;

29.                }

以上是判断有没有输入的内容;

File file = new File(args[0]);

31.                if(!(file.exists() && file.isFile()))

32.                {

33.                        System.out.println("该文件有问题,要么不存在,要么不是文件");

34.                        return;

35.                }

36.                if(!file.getName().endsWith(".jpg"))

37.                {

38.                        System.out.println("图片格式错误,请重新选择");

39.                        return;

40.                }

41.                if(file.length()>1024*1024*5)

42.                {

43.                        System.out.println("文件太大了,我放不下");

44.                        return;

45.                }

以上是判断文件是否存在,限制大小和格式;

Socket s = new Socket("127.0.0.1",10007);这句是连接到ip地址为127.0.0.1的电脑上的10007端口上;
FileInputStream fis = new FileInputStream(file);输入流关联文件,用来读取文件内容;
  OutputStream out = s.getOutputStream();得到客户端的输出流,往里面写东西(写文件内容);

  • byte[] buf = new byte[1024];
  •                 int len = 0;
  •                 while((len = fis.read(buf)) != -1)
  •                 {
  •                         out.write(buf,0,len);
  •                 }
以上是把文件的内容读到一个byte数组中,再写到客户端的输出流里;
InputStream in = s.getInputStream();得到客户端的输入流,里面有服务器端传来的数据;

  • byte[] bufIn = new byte[1024];
  •                 int num = in.read(bufIn);
  •                 System.out.println(new String(bufIn,0,num));
以上是读取客户端输入流里面的数据并输出;

下面解释服务器端:

ServerSocket ss = new ServerSocket(10007);开启一个10007端口

  • while(true){
  •                 Socket s = ss.accept();
  •                 new Thread(new PicThread(s)).start();
  •                 }
以上是得到连接的客户端,并为每个连接的客户端开启一个线程;

    解释服务器线程
    InputStream in = s.getInputStream();得到客户端的输入流,里面放有客户端文件内容;

  • File file = new File(ip+"("+count+")"+".jpg");
  •                         while(file.exists())
  •                                 file = new File(ip+"("+(count++)+")"+".jpg");
以上是设置存放接收的文件路径和名称;

  • FileOutputStream fos = new FileOutputStream(file);
  •                         byte[] buf = new byte[1024];
  •                         int len = 0;
  •                         while((len = in.read(buf)) != -1)
  •                         {
  •                                 fos.write(buf,0,len);
  •                         }
以上是把客户端输入流里的内容写到服务器端的文件中;
  • OutputStream out = s.getOutputStream();
  •                         out.write("上传成功".getBytes());
以上是把“上传成功”变成字节写到客户端的输出流中。


翻译完毕!写那么多快累死本人了,没有功劳也有苦劳,请加分,谢谢!



评分

参与人数 1技术分 +2 收起 理由
王德云 + 2

查看全部评分

回复 使用道具 举报
侯伟浩 发表于 2011-12-12 10:23
解释客户端:
25.                if(args.length != 1)

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