局域网文件传输和复制,含文件名
实施局域网内文件复制,包括需要把文件名也拷贝过去。特点是文件名传输和文件传输动用了两个端口。进程完成这样的功能:每隔24小时进
行上传一次,保持两台机器的根目录下文件一致。
1:服务器端,也既待上传端。运行命令:java FileServer 3107 import java.io.*; import java.net.*;
public class FileServer implements Runnable { private static int ipsocket = 0; public static void main(String[] args)throws Exception{ ipsocket = Integer.parseInt(args[0]); //建议使用3107 System.out.println("系统在端口:" + ipsocket + "等待发送"); Thread t1 = new Thread(new FileServer()); t1.start(); } public void run(){ while(true){ try{ String[] fileNames = seachFileName(1); if(fileNames == null || fileNames.length < 1) return; for(int i = 0; i < fileNames.length; i ++){ sendFileName(fileNames[i]); sendFile(fileNames[i]); } Thread.sleep(24 * 60 * 60 * 1000); //24小时 }catch(Exception e) { System.out.println(e); } } } /* listType = 0 返回含文件夹和文件 listType = 1 只返回文件 */ public static String[] seachFileName(int listType) throws Exception{ String directory = "."; File dir = new File(directory); File dirTemp; String[] filesTemp; String[] fileNames; String[] re; int length = 0; if (!dir.isDirectory()) throw new IllegalArgumentException("FileList: no such directory");
filesTemp = dir.list(); java.util.Arrays.sort(filesTemp); for(int i = 0; i < filesTemp.length; i++) { dirTemp = new File(directory + "\\" + filesTemp[i]); if(!dirTemp.isDirectory()){ length++; } } fileNames = new String[length]; length = 0; for(int i = 0; i < filesTemp.length; i++) { dirTemp = new File(directory + "\\" + filesTemp[i]); if(!dirTemp.isDirectory()){ fileNames[length] = filesTemp[i]; } length++; } if(listType == 0) re = filesTemp; else re = fileNames; return re;
} /*发文件名 */ private static void sendFileName(String fileNames) throws Exception{ if(fileNames == null) return; //创建网络服务器接受客户请求 ServerSocket ss=new ServerSocket(ipsocket); Socket client=ss.accept(); //创建网络输出流并提供数据包装器 OutputStream netOut=client.getOutputStream(); OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut)); //创建文件读取缓冲区 byte[] buf=null; String fileName = fileNames; buf = fileName.getBytes(); int num=buf.length; if(num > 0){//是否读完文件 doc.write(buf,0,num);//把文件数据写出网络缓冲区 doc.flush();//刷新缓冲区把数据写往客户端 } doc.close(); ss.close(); } /*发文件本身 */ private static void sendFile(String fileName) throws Exception{ if(fileName == null) return; //创建文件流用来读取文件中的数据 File file=new File(fileName); FileInputStream fos=new FileInputStream(file); //创建网络服务器接受客户请求 ServerSocket ss=new ServerSocket(ipsocket + 1); Socket client=ss.accept(); //创建网络输出流并提供数据包装器 OutputStream netOut=client.getOutputStream(); OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut)); //创建文件读取缓冲区 byte[] buf=new byte[2048]; int num=fos.read(buf); while(num!=(-1)){//是否读完文件 doc.write(buf,0,num);//把文件数据写出网络缓冲区 doc.flush();//刷新缓冲区把数据写往客户端 num=fos.read(buf);//继续从文件中读取数据 } fos.close(); doc.close(); ss.close(); } }
2:客户端,也既文件接受端。运行命令:java FileClient 127.0.0.1 3107。注意跟服务器端口要一致。 import java.io.*; import java.net.*; public class FileClient implements Runnable { private static String ip = ""; private static int ipsocket = 0; public static void main(String[] args)throws Exception{ ip = args[0]; ipsocket = Integer.parseInt(args[1]); //建议使用3107 System.out.println("系统在地址@" + ip + ":" + ipsocket + "倾听"); Thread t1 = new Thread(new FileClient()); t1.start(); } public void run(){ while(true){ try{ String strTemp = getFileName(); getFile(strTemp); }catch(Exception e){} try{ Thread.sleep(5 * 1000); //5秒 }catch(Exception e) { System.out.println(e); } } } private static String getFileName() throws Exception{ // 通过Socket连接文件服务器 Socket server=new Socket(ip,ipsocket);
//创建网络接受流接受服务器文件数据 InputStream netIn=server.getInputStream(); InputStream in=new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据 byte[] buf=new byte[2048]; int num=in.read(buf); while(num!=(-1)){//是否读完所有数据 num=in.read(buf);//继续从网络中读取文件 } String fileName = new String(buf); fileName = fileName.trim(); in.close(); server.close(); return fileName; } private static void getFile(String strTemp) throws Exception{ //使用本地文件系统接受网络数据并存为新文件 File file=new File(strTemp); //如果文件已经存在,先删除 if(file.exists()) file.delete(); for(int i = 0 ; i < 10000; i++) {} file.createNewFile(); RandomAccessFile raf=new RandomAccessFile(file,"rw");
// 通过Socket连接文件服务器 Socket server=new Socket(ip,(ipsocket + 1) );
//创建网络接受流接受服务器文件数据 InputStream netIn=server.getInputStream(); InputStream in=new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据 byte[] buf=new byte[2048]; int num=in.read(buf); while(num!=(-1)){//是否读完所有数据 raf.write(buf,0,num);//将数据写往文件 raf.skipBytes(num);//顺序写文件字节 num=in.read(buf);//继续从网络中读取文件 } in.close(); raf.close(); server.close(); } }
关于本文:纯参考用,有意见欢迎BT [email protected]或www.10ms.net

|