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();
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------客户端
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());
}
}
}
|
|