自己用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类型的字节流可以根据信息类型分别进行处理。

你可能感兴趣的:(java实现)