目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现。
TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件
代码实例:
l 首先编写服务器端程序,用来接收图片。
//服务器端 public class TCPServer { public static void main(String[] args) throws IOException { //明确端口号 ServerSocket server=new ServerSocket(9999); //建立连接 Socket socket=server.accept(); //显示哪个客户端Socket连接上了服务器 InetAddress ipObject = server.getInetAddress();//得到IP地址对象 String ip = ipObject.getHostAddress(); //得到IP地址字符串 System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip); //明确数据源,获取Socket的输入流 InputStream in=socket.getInputStream(); //明确目的地 File file=new File("e:\haizei"); //判断文件是否存在 if(!file.exists()){ file.mkdirs(); } //创建接收文件名称(避免重复):域名+毫秒值+3位随机数 String filename="oracle"+System.currentTimeMillis()+(Math.random()*9+1)*100+".jpg"; FileOutputStream fos=new FileOutputStream(file+File.separator+filename); //开始复制 int len=0; byte[] bytes=new byte[1024]; while((len=in.read(bytes))!=-1){ fos.write(bytes, 0, len); } //回复客户端 OutputStream out=socket.getOutputStream(); out.write("上传成功".getBytes()); //释放资源 fos.close(); server.close(); } }
l 编写客户端,完成上传图片
//客户端 public class TCPClient { public static void main(String[] args) throws IOException { Socket socket=new Socket("127.0.0.1",8000); OutputStream out=socket.getOutputStream(); FileInputStream fis=new FileInputStream("d:\haizei.jpg"); int len=0; byte[] bytes=new byte[1024]; while ((len=fis.read(bytes))!=-1) { out.write(bytes,0,len); } //传输的是字符数组,没有结束符,不能读取-1,要添加结束方法 //告诉服务器端,不要再读了,到末尾了 socket.shutdownOutput(); //服务器回复 InputStream in=socket.getInputStream(); len=in.read(bytes); System.out.println(new String(bytes,0,len)); //释放资源 fis.close(); socket.close(); } }
文件上传案例多线程版本
实现服务器端可以同时接收多个客户端上传的文件。
l 我们要修改服务器端代码
public class UPload implements Runnable{ private Socket socket; public UPload(Socket socket){ this.socket=socket; } public void run() { FileOutputStream fos=null; try{ InetAddress ipObject = socket.getInetAddress();//得到IP地址对象 String ip = ipObject.getHostAddress(); //得到IP地址字符串 System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip); //明确数据源 InputStream in=socket.getInputStream(); //明确目的地 File file=new File("e:\haizei"); //判断文件是否存在 if(!file.exists()){ file.mkdirs(); } //域名+毫秒值+6位随机数 String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999)+".jpg"; fos=new FileOutputStream(file+File.separator+filename); //开始复制 int len=0; byte[] bytes=new byte[1024]; while((len=in.read(bytes))!=-1){ fos.write(bytes, 0, len); } //回复客户端 OutputStream out=socket.getOutputStream(); out.write("上传成功".getBytes()); }catch(IOException ex){ ex.printStackTrace(); }finally{ //释放资源 try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
创建实验类
public class Demo { public static void main(String[] args) throws IOException { //明确端口号 ServerSocket server =new ServerSocket(8000); //死循环,不断创建线程 while(true){ //接收客户端 Socket socket=server.accept(); //匿名对象,创建线程 new Thread(new UPload(socket)).start(); } } }