Ftp文件上传的实现

来源:互联网 发布:python socket通信框架 编辑:程序博客网 时间:2024/05/22 07:41

客户端

package question10;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.net.Socket;/* * 使用TCP协议写一个可以上传文件的服务器和客户端。 *  * 客户端类 *  * 老师运行完要F5刷新下项目 */public class FTPClient{public static void main(String[] args) throws Exception{//链接服务器,127.0.0.1表示本机,5678为端口号Socket socket = new Socket("127.0.0.1", 5678);System.out.println("conneted server");//需要上传的文件路径,这里是当前这个java源文件String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"+File.separator+"FTPClient.java";//根据路径链接到本机文件系统File file = new File(path);//取得到服务器的输出流,用来写入数据DataOutputStream dos = new DataOutputStream(socket.getOutputStream());System.out.println("start write");writeHead(dos, file);writeFile(dos, file);System.out.println("write finished");}/** * 写传输头,这里只是文件名字 */public static void writeHead(DataOutputStream dos, File file) throws IOException{dos.writeUTF(file.getName());dos.flush();}/** * 读取文件并传输给服务器 */public static void writeFile(DataOutputStream dos, File file) throws IOException{DataInputStream dis = new DataInputStream(new FileInputStream(file));//超过两个G的文件会出问题,获取不到准确的大小//并且dis.available() > 0表达式也不能正确//工作dos.writeInt(dis.available());System.out.println("file size " + dis.available() + " bytes");while(dis.available() > 0){dos.write(dis.read());}dos.flush();}}


服务器
package question10;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/* * 使用TCP协议写一个可以上传文件的服务器和客户端。 *  * 服务器类 *  * 老师运行完要F5刷新下项目 */public class FTPServer{public static void main(String[] args) throws Exception{//启动服务器,并监听5678端口的链接请求ServerSocket ss = new ServerSocket(5678);Socket client = ss.accept();System.out.println("client conneted");//建立到客户端的输入流,用以读取数据DataInputStream dis = new DataInputStream(client.getInputStream());//读取数据头,即文件名String fileName = readHead(dis);System.out.println("start read " + fileName);//服务器将要保存从客户端上传的文件的路径//这里是当前这个服务器java源文件的所在目录//传完F5刷新下项目String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"+File.separator;//给保存的文件加了点东西,要不就把这个客户端//那个java源文件给覆盖了,看不出来效果File file = new File(path + fileName.replace(".", "$1."));readFile(dis, file);System.out.println("read finished");}/** * 读取并返回数据头,也就是文件名字 */public static String readHead(DataInputStream dis) throws IOException{return dis.readUTF();}/** * 读取客户端传来的文件数据并写入本地文件 */public static void readFile(DataInputStream dis, File file) throws IOException{//取得文件大小int length = dis.readInt();//将文件数据写如本地文件DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));//创建文件file.createNewFile();for (int i = 0; i < length; i++)        {        dos.write(dis.read());        }}}


原创粉丝点击