网络协议里面有个FTP(文件传输协议),专门用于传输文件。但今天我们用Socke直接实现客户端与服务器端的文件传输,只需要在上次的Socke通讯中稍作改变,就可以达到文件传输的目的。
步骤
1.创建服务器端
package FileSocket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { File file=new File("E:\\Client.java");//保存文件的绝对路径 ServerSocket ss=new ServerSocket(6666);//创建客户端 并指定端口号 //服务器开启监听 Socket socket=ss.accept(); InputStream is=socket.getInputStream(); //得到socket自带的输入流 OutputStream os=socket.getOutputStream();//得到socket自带的输出流 BufferedReader br=new BufferedReader(new InputStreamReader(is));//输入缓存流 用于接收客户端的数据 PrintWriter pw=new PrintWriter(new FileWriter(file),true);//将缓存中的数据 打印(输出)到文件中 String temp=null; while ((temp=br.readLine())!=null){//读 pw.println(temp);//写 pw.flush();//刷新 } System.out.println("接受成功!"); br.close();//关闭 pw.close(); ss.close(); socket.close(); } }
创建服务器端,通过Socket将客户端的数据放入Buffer缓存流中,然后将缓存流中的数据写到文件中(边读边写)。
2.创建客户端
package FileSocket; import java.io.*; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { File file=new File("src/FileSocket/Client.java");//要传送的文件路径(相对路径) Socket socket=new Socket("localhost",6666);//指定客户端的 IP地址 和端口号 InputStream is=socket.getInputStream(); OutputStream os=socket.getOutputStream(); BufferedReader br=new BufferedReader(new FileReader(file));//用于读取文件中的数据 PrintWriter pw=new PrintWriter(os,true);//将文件传送到服务器端 String temp=null; while ((temp=br.readLine())!=null){//读 pw.println(temp);//写(通过Socket写入到对方) pw.flush(); } System.out.println(file.getName()+"文件以传送!"); br.close();//关闭 pw.close(); socket.close(); } }
创建客户端,将文件读到Buffer缓存中,然后将缓存中的数据通过Socket传输到服务器端。
3.先开启服务器端,再开启客户端
这时,你会E盘下面看见Client.java文件,也就是你项目客户端里面的代码。
总结
在我们传输文件的时候,就类似与通过IO流实现文件的拷贝,只是加上了Socket。客户端先将文件读到内存(缓存区),然后将缓存区的数据通过Socket传到服务器端。服务器端将来自客户端的数据读到缓冲区,然后将缓冲区的数据写到文件中。这个过程中,客户端和服务器都进行着读写操作,只是读写方向不同。
每日鸡汤:有选择,就会有后悔。所以不需要后悔!
Over!