A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王章亚 中级黑马   /  2012-6-22 08:52  /  1803 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马