自己用java实现飞鸽传书 2 - 实现文件传输

第二步:实现文件传递。

上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。

调整后的代码:

服务端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    
    public static void main(String[] args){
        //创建服务端socket,用以网络信息的接收
        ServerSocket serverSocket = null;
        try {
            //服务端socket使用本地IP,端口号使用36000
            serverSocket = new ServerSocket(36000);
            //保证服务端持续运行
            while(true){
                //接收网络信息,未接收到则阻塞当前线程
                Socket socket = serverSocket.accept();
                //将文件信息写入socket通信
                writeFile(socket);
                //关闭socket,防止客户端长时间等待
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 将文件信息写入socket通信流
     * @param socket
     *             socket
     */
    private static void writeFile(Socket socket){
        try{
            //获取本地文件
            String filePath ="D:/test.pdf";
            //创建文件对象
            File file = new File(filePath);
            //使用DataOutputStream传送文件信息
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            //写入文件名
            dos.writeUTF(file.getName());
            //写入文件大小
            dos.writeLong(file.length());
            //清空缓冲区
            dos.flush();
            //使用DataInputStream将文件写入
            DataInputStream dis = new DataInputStream( new FileInputStream(file) ); 
            byte[] buffer = new byte[1024];
            int head = 0;
            while((head=dis.read(buffer)) > 0){
                dos.write(buffer, 0, head);
            }
            dis.close();
            dos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args){
        DataInputStream input = null;
        Socket clientSocket = null;
        try {
            //创建客户端socket,用以连接服务端
            clientSocket = new Socket("127.0.0.1", 36000);
            //读取服务端发送的信息流
            input = new DataInputStream(clientSocket.getInputStream());
            String fileName = input.readUTF();
            long fileSize = input.readLong();
            System.out.println("收到服务端发过来的文件,文件名称为:" 
                                + fileName + ",文件大小为:" + fileSize);
            //将文件读入本地
            String savePath = "E:\\just a test.pdf";
            DataOutputStream fos = new DataOutputStream(new FileOutputStream(savePath));
            byte[] buffer = new byte[1024];
            int head = 0;
            while((head=input.read(buffer)) > 0){
                fos.write(buffer, 0, head);
            }
            
            fos.close();
            input.close();
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本次文件流的传送使用了DataOutputStream和DataInputStream,使用Data类型的字节流可以根据信息类型分别进行处理。

posted @ 2014-12-02 17:30  robin·张  阅读(733)  评论(0编辑  收藏  举报