本帖最后由 陈洋 于 2013-9-25 11:19 编辑  
 
Socket s = ss.accept(); 
我想知道这里为什么不放到run方法中, 
而下面的开启线程传入的Runnable实现类就不需要 
传入Socket对象了,通过线程启动后,在创建Socket对象。- /*
 
 - 需求:上传图片。
 
  
 
 
- */
 
 - /*
 
 - 客户端。
 
 - 1,服务端点。
 
 - 2,读取客户端已有的图片数据。
 
 - 3,通过socket 输出流将数据发给服务端。
 
 - 4,读取服务端反馈信息。
 
 - 5,关闭。
 
  
- */
 
  
- import java.io.*;
 
 - import java.net.*;
 
 - class  PicClient
 
 - {
 
 -         public static void main(String[] args)throws Exception 
 
 -         {
 
 -                 if(args.length!=1)//为什么这里判断长度是1,就防止乱传参数呢?
 
 -                 {
 
 -                         System.out.println("请选择一个jpg格式的图片");
 
 -                         return ;
 
 -                 }
 
  
 
 
 
-                 File file = new File(args[0]);
 
 -                 if(!(file.exists() && file.isFile()))
 
 -                 {
 
 -                         System.out.println("该文件有问题,要么补存在,要么不是文件");
 
 -                         return ;
 
  
-                 }
 
  
-                 if(!file.getName().endsWith(".jpg"))
 
 -                 {
 
 -                         System.out.println("图片格式错误,请重新选择");
 
 -                         return ;
 
 -                 }
 
  
-                 if(file.length()>1024*1024*5)
 
 -                 {
 
 -                         System.out.println("文件过大,没安好心");
 
 -                         return ;
 
 -                 }
 
 -                 
 
  
 
 
-                 Socket s = new Socket("192.168.1.254",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);
 
 -                 }
 
  
-                 //告诉服务端数据已写完
 
 -                 s.shutdownOutput();
 
  
-                 InputStream in = s.getInputStream();
 
  
-                 byte[] bufIn = new byte[1024];
 
  
-                 int num = in.read(bufIn);
 
 -                 System.out.println(new String(bufIn,0,num));
 
  
-                 fis.close();
 
 -                 s.close();
 
 -         }
 
 - }
 
  
- /*
 
 - 服务端
 
  
- 这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
 
 - 这时B客户端连接,只有等待。
 
 - 因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
 
 - 暂时获取不到B客户端对象。
 
  
- 那么为了可以让多个客户端同时并发访问服务端。
 
 - 那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
 
  
 
 
- 如何定义线程呢?
 
  
- 只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。
 
 - */
 
  
- class PicThread implements Runnable
 
 - {
 
  
-         private Socket s;
 
 -         PicThread(Socket s)
 
 -         {
 
 -                 this.s = s;
 
 -         }
 
 -         public void run()
 
 -         {
 
  
-                 int count = 1;
 
 -                 String ip  = s.getInetAddress().getHostAddress();
 
 -                 try
 
 -                 {
 
 -                         System.out.println(ip+"....connected");
 
  
-                         InputStream in = s.getInputStream();
 
  
-                         File dir =  new File("d:\\pic");
 
  
-                         File file = new File(dir,ip+"("+(count)+")"+".jpg");
 
  
-                         while(file.exists())
 
 -                                 file = new File(dir,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());
 
  
-                         fos.close();
 
  
-                         s.close();
 
 -                 }
 
 -                 catch (Exception e)
 
 -                 {
 
 -                         throw new RuntimeException(ip+"上传失败");
 
 -                 }
 
 -         }
 
 - }
 
  
 
 
- class  PicServer
 
 - {
 
 -         public static void main(String[] args) throws Exception
 
 -         {
 
 -                 ServerSocket ss = new ServerSocket(10007);
 
  
-                 while(true)
 
 -                 {
 
 -                         Socket s = ss.accept();//我想知道这里为什么不放到run方法中,
 
 -                                                                         //而下面的开启线程传入的Runnable实现类就不需要
 
 -                                                                         //传入Socket对象了,通过线程启动后,在创建Socket对象。
 
  
-                         new Thread(new PicThread(s)).start();
 
  
-                 
 
 -                 }
 
  
-                 //ss.close();
 
 -         }
 
 - }
 
  复制代码 |