您的位置:首页 > 编程语言 > Java开发

Java Socket编程 文件传输(客户端从服务器下载一个文件)

2015-03-29 20:21 459 查看
服务器(Server) 

[java] view plaincopy 
package com.socket.sample;  
  
import java.io.BufferedInputStream;  
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 ServerTest {  
    int port = 8821;  
  
    void start() {  
        Socket s = null;  
        try {  
            ServerSocket ss = new ServerSocket(port);  
            while (true) {  
                // 选择进行传输的文件  
                String filePath = "D:\\lib.rar";  
                File fi = new File(filePath);  
  
                System.out.println("文件长度:" + (int) fi.length());  
  
                // public Socket accept() throws  
                // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。  
  
                s = ss.accept();  
                System.out.println("建立socket链接");  
                DataInputStream dis = new DataInputStream(  
                        new BufferedInputStream(s.getInputStream()));  
                dis.readByte();  
  
                DataInputStream fis = new DataInputStream(  
                        new BufferedInputStream(new FileInputStream(filePath)));  
                DataOutputStream ps = new DataOutputStream(s.getOutputStream());  
                // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java  
                // 4th里有现成的代码。  
                ps.writeUTF(fi.getName());  
                ps.flush();  
                ps.writeLong((long) fi.length());  
                ps.flush();  
  
                int bufferSize = 8192;  
                byte[] buf = new byte[bufferSize];  
  
                while (true) {  
                    int read = 0;  
                    if (fis != null) {  
                        read = fis.read(buf);  
                        // 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b  
                        // 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file)  
                        // 或抛出异常之前,此方法将一直阻塞。  
                    }  
  
                    if (read == -1) {  
                        break;  
                    }  
                    ps.write(buf, 0, read);  
                }  
                ps.flush();  
                // 注意关闭socket链接哦,不然客户端会等待server的数据过来,  
                // 直到socket超时,导致数据不完整。  
                fis.close();  
                s.close();  
                System.out.println("文件传输完成");  
            }  
  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static void main(String arg[]) {  
        new ServerTest().start();  
    }  
}  
客户端工具(SocketTool) 
[java] view plaincopy 
package com.socket.sample;  
  
import java.io.BufferedInputStream;  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.net.Socket;  
  
public class ClientSocket {  
    private String ip;  
  
    private int port;  
  
    private Socket socket = null;  
  
    DataOutputStream out = null;  
  
    DataInputStream getMessageStream = null;  
  
    public ClientSocket(String ip, int port) {  
        this.ip = ip;  
        this.port = port;  
    }  
  
    /** */  
    /** 
     * 创建socket连接 
     *  
     * @throws Exception 
     *             exception 
     */  
    public void CreateConnection() throws Exception {  
        try {  
            socket = new Socket(ip, port);  
        } catch (Exception e) {  
            e.printStackTrace();  
            if (socket != null)  
                socket.close();  
            throw e;  
        } finally {  
        }  
    }  
  
    public void sendMessage(String sendMessage) throws Exception {  
        try {  
            out = new DataOutputStream(socket.getOutputStream());  
            if (sendMessage.equals("Windows")) {  
                out.writeByte(0x1);  
                out.flush();  
                return;  
            }  
            if (sendMessage.equals("Unix")) {  
                out.writeByte(0x2);  
                out.flush();  
                return;  
            }  
            if (sendMessage.equals("Linux")) {  
                out.writeByte(0x3);  
                out.flush();  
            } else {  
                out.writeUTF(sendMessage);  
                out.flush();  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
            if (out != null)  
                out.close();  
            throw e;  
        } finally {  
        }  
    }  
  
    public DataInputStream getMessageStream() throws Exception {  
        try {  
            getMessageStream = new DataInputStream(new BufferedInputStream(  
                    socket.getInputStream()));  
            return getMessageStream;  
        } catch (Exception e) {  
            e.printStackTrace();  
            if (getMessageStream != null)  
                getMessageStream.close();  
            throw e;  
        } finally {  
        }  
    }  
  
    public void shutDownConnection() {  
        try {  
            if (out != null)  
                out.close();  
            if (getMessageStream != null)  
                getMessageStream.close();  
            if (socket != null)  
                socket.close();  
        } catch (Exception e) {  
  
        }  
    }  
}  

客户端(Client) 

[java] view plaincopy 
package com.socket.sample;  
  
import java.io.BufferedOutputStream;  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.FileOutputStream;  
  
public class ClientTest {  
    private ClientSocket cs = null;  
  
    private String ip = "localhost";// 设置成服务器IP  
  
    private int port = 8821;  
  
    private String sendMessage = "Windows";  
  
    public ClientTest() {  
        try {  
            if (createConnection()) {  
                sendMessage();  
                getMessage();  
            }  
  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    }  
  
    private boolean createConnection() {  
        cs = new ClientSocket(ip, port);  
        try {  
            cs.CreateConnection();  
            System.out.print("连接服务器成功!" + "\n");  
            return true;  
        } catch (Exception e) {  
            System.out.print("连接服务器失败!" + "\n");  
            return false;  
        }  
  
    }  
  
    private void sendMessage() {  
        if (cs == null)  
            return;  
        try {  
            cs.sendMessage(sendMessage);  
        } catch (Exception e) {  
            System.out.print("发送消息失败!" + "\n");  
        }  
    }  
  
    private void getMessage() {  
        if (cs == null)  
            return;  
        DataInputStream inputStream = null;  
        try {  
            inputStream = cs.getMessageStream();  
        } catch (Exception e) {  
            System.out.print("接收消息缓存错误\n");  
            return;  
        }  
  
        try {  
            // 本地保存路径,文件名会自动从服务器端继承而来。  
            String savePath = "E:\\";  
            int bufferSize = 8192;  
            byte[] buf = new byte[bufferSize];  
            int passedlen = 0;  
            long len = 0;  
  
            savePath += inputStream.readUTF();  
            DataOutputStream fileOut = new DataOutputStream(  
                    new BufferedOutputStream(new FileOutputStream(savePath)));  
            len = inputStream.readLong();  
  
            System.out.println("文件的长度为:" + len + "\n");  
            System.out.println("开始接收文件!" + "\n");  
  
            while (true) {  
                int read = 0;  
                if (inputStream != null) {  
                    read = inputStream.read(buf);  
                }  
                passedlen += read;  
                if (read == -1) {  
                    break;  
                }  
                // 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比  
                System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");  
                fileOut.write(buf, 0, read);  
            }  
            System.out.println("接收完成,文件存为" + savePath + "\n");  
  
            fileOut.close();  
        } catch (Exception e) {  
            System.out.println("接收消息错误" + "\n");  
            return;  
        }  
    }  
  
    public static void main(String arg[]) {  
        new ClientTest().getMessage();  
    }  
}  

测试是成功的,在DOS命令行下编译~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐