局域网文件传输和复制,含文件名
实施局域网内文件复制,包括需要把文件名也拷贝过去。特点是文件名传输和文件传输动用了两个端口。进程完成这样的功能:每隔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
luminji@hotmail.com或www.10ms.net