码迷,mamicode.com
首页 > 移动开发 > 详细

android--Java基于Socket文件传输示例

时间:2016-04-29 17:40:05      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。

1.服务器端

技术分享package sterning;
技术分享
技术分享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);
技术分享                    }

技术分享
技术分享                    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();
技术分享    }

技术分享}

技术分享

2.socket的Util辅助类

技术分享package sterning;
技术分享
技术分享import java.net.*;
技术分享import java.io.*;
技术分享
技术分享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) {
技术分享
技术分享        }

技术分享    }

技术分享}

技术分享

3.客户端

技术分享package sterning;
技术分享
技术分享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 = "Windwos";
技术分享
技术分享    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 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();
技术分享    }

技术分享}

这就实现了从服务器端向客户端发送文件的过程,当然,反过来,也一样.稍有不同.代码中对跨平台的细节没有实现,有时间或兴趣的朋友可以提供一下.

android--Java基于Socket文件传输示例

标签:

原文地址:http://blog.csdn.net/xuexiiphone/article/details/51252703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!