《黑马程序员》 图片上传服务端的多线程技术的体现

------- android培训、 java培训、期待与您交流! ----------
 package cn.itcast.p4.task;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadClient {
 /**
  * @param args
  * @throws IOException 
  */
 public static void main(String[] args) throws IOException {
  /**
   * 图片上传客户端的建立:
   * */
  
  //建立客户端连接
  Socket s=new Socket("172.168.151.212",10000);
  
  //使用文件读取流和源文件关联
  FileInputStream fis=new FileInputStream("d:\\vail1.png");
  
  //获取socket流将数据发送给服务端
  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 ins=s.getInputStream();
  
  byte [] buin=new byte[1024];
  int mess=ins.read(buin);
  String text=new String(buin,0,mess);
  System.out.println(text);
  //关闭资源
  //关闭普通流,socket流不需要关闭,因为一关闭,通道就不存在了。数据就无法进行传输了。
  fis.close();
  s.close();
 }
}


package cn.itcast.p4.task;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
 /**
  * @param args
  * @throws IOException 
  */
 public static void main(String[] args) throws IOException {
  /**
   * 服务端的建立:
   * */
  //创建服务端
  ServerSocket ss=new ServerSocket(10000);
  
  while(true){
  //获取客户端
  Socket s=ss.accept();
  new Thread(new UploadTask(s)).start();
  }
//  ss.close();
  
 }
}
 

package cn.itcast.p4.task;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadTask implements Runnable {
 private Socket s;
 int count=0;  //用于给文件编号使用
 
 
 public UploadTask(Socket s) {
  super();
  this.s = s;
 }

 @Override
 public void run() {
  //获取客户端的信息
  String ip=s.getInetAddress().getHostAddress();
  System.out.println(ip+".....connection");
  
  try {
   //获取socket流读取客户端的数据
   InputStream in=s.getInputStream();
   
   //创建目的,用于将读取到的图片数据写入到目的地中
   File dir=new File("c:\\pic");
   if(!dir.exists()){
    dir.mkdirs();
   }
   //封装文件名
   File file=new File(dir,ip+".jpg");
   //如果使用ip做为文件的名称存在的话,就使用ip+编号来做为文件名称。
   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 (IOException e) {
   // TODO: handle exception
   e.printStackTrace();
  }
  
 }
}
 



你可能感兴趣的:(《黑马程序员》 图片上传服务端的多线程技术的体现)