首页 > 代码库 > Android 用Socket实现PC和手机的文件传输

Android 用Socket实现PC和手机的文件传输

PC服务器端代码:

/* * PC与<a href="http://www.mamicode.com/http://lib.csdn.net/base/android" class=‘replace_word‘ title="Android知识库" target=‘_blank‘ style=‘color:#df3434; font-weight:bold;‘>Android</a>客户端实现文件的传送 * PC服务器端 */package com.<a href=http://www.mamicode.com/"http://lib.csdn.net/base/android" class=replace_word title="Android知识库" target=_blank style=color:#df3434; font-weight:bold;>android</a>.test;import <a href=http://www.mamicode.com/"http://lib.csdn.net/base/java" class=replace_word title="Java 知识库" target=_blank style=color:#df3434; font-weight:bold;>Java</a>.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java<a href=http://www.mamicode.com/"http://lib.csdn.net/base/dotnet" class=replace_word title=".NET知识库" target=_blank style=color:#df3434; font-weight:bold;>.NET</a>.ServerSocket;import java<a href=http://www.mamicode.com/"http://lib.csdn.net/base/dotnet" class=replace_word title=".NET知识库" target=_blank style=color:#df3434; font-weight:bold;>.net</a>.Socket;public class TransferFileServer {    private static final int HOST_PORT = 8821;    private void start() {        Socket s = null;        try {            ServerSocket ss = new ServerSocket(HOST_PORT);            while (true) {                String filePath = "/home/fan/Pictures/1.jpg";                File file = new File(filePath);                System.out.println("文件长度:" + (int) file.length());                s = ss.accept();                log("建立Socket连接");                DataInputStream dis = new DataInputStream(                        new BufferedInputStream(s.getInputStream()));                dis.readByte();                DataInputStream fis = new DataInputStream(                        new BufferedInputStream(new FileInputStream(filePath)));                DataOutputStream dos = new DataOutputStream(s.getOutputStream());                dos.writeUTF(file.getName());                dos.flush();                dos.writeLong((long) file.length());                dos.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;                    }                    dos.write(buf,0,read);                }                dos.flush();                 // 注意关闭socket链接哦,不然客户端会等待server的数据过来,                // 直到socket超时,导致数据不完整。                fis.close();                s.close();                log("文件传输完成");            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    void log(String msg) {        System.out.println(msg);    }    public static void main(String args[]) {        new TransferFileServer().start();    }}

ClientSocket:辅助类

/* * PC与Android文件传输 * Android客户端 */package com.android.test;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java<a href=http://www.mamicode.com/"http://lib.csdn.net/base/dotnet" class=replace_word title=".NET知识库" target=_blank style=color:#df3434; font-weight:bold;>.Net</a>.Socket;import java.net.UnknownHostException;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;    }    public void createConnection() {        try {            socket = new Socket(ip, port);        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();            if (socket != null) {                try {                    socket.close();                } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                }            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();            if (socket != null) {                try {                    socket.close();                } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                }            }        } finally {        }    }    public void sendMessage(String sendMessage) {        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("<a href=http://www.mamicode.com/"http://lib.csdn.net/base/linux" class=‘replace_word‘ title="Linux知识库" target=‘_blank‘ style=‘color:#df3434; font-weight:bold;‘>Linux</a>")) {                out.writeByte(0x3);                out.flush();            } else {                out.writeUTF(sendMessage);                out.flush();            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();            if (out != null) {                try {                    out.close();                } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                }            }        }    }    public DataInputStream getMessageStream() {        try {            getMessageStream = new DataInputStream(new BufferedInputStream(                    socket.getInputStream()));            // return getMessageStream;        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();            if (getMessageStream != null) {                try {                    getMessageStream.close();                } catch (IOException e1) {                    // TODO Auto-generated catch block                    e1.printStackTrace();                }            }        }        return getMessageStream;    }    public void shutDownConnection() {        try {            if (out != null) {                out.close();            }            if (getMessageStream != null) {                getMessageStream.close();            }            if (socket != null) {                socket.close();            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

Android客户端:Acitivyt实现:

package com.android.test;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class Main extends Activity implements OnClickListener{    private ClientSocket cs = null;    private static final String FILE_PATH = "/mnt/sdcard/";    private String ip = "192.168.1.103";    private int port = 8821;    private String sendMessage = "<a href=http://www.mamicode.com/"http://lib.csdn.net/base/linux" class=‘replace_word‘ title="Linux知识库" target=‘_blank‘ style=‘color:#df3434; font-weight:bold;‘>linux</a>";    private Button mButton;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mButton = (Button)findViewById(R.id.start);        mButton.setOnClickListener(this);    }    private void start() {        if (createConnection()) {            sendMessage();            getMessage();        }    }    private void getMessage() {        if (cs == null)            return;        DataInputStream inputStream = null;        inputStream = cs.getMessageStream();        try {            String savePath = FILE_PATH;            int bufferSize = 8192;            byte[] buf = new byte[bufferSize];            int passedlen = 0;            long len = 0;                        savePath += inputStream.readUTF();            Log.d("AndroidClient","@@@savePath"+savePath);            DataOutputStream fileOut = new DataOutputStream(                    new BufferedOutputStream(new BufferedOutputStream(                            new FileOutputStream(savePath))));            len = inputStream.readLong();            Log.d("AndoridClient","文件的长度为:"+len);            Log.d("AndroidClient","开始接收文件");            while(true) {                int read = 0;                if (inputStream != null) {                    read = inputStream.read(buf);                }                passedlen += read;                if (read == -1) {                    break;                }                Log.d("AndroidClient","文件接收了"+(passedlen*100/len)+"%/n");                fileOut.write(buf,0,read);            }            Log.d("AndroidClient","@@@文件接收完成"+savePath);            fileOut.close();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    private void sendMessage() {        if (cs == null)            return;        cs.sendMessage(sendMessage);    }    private boolean createConnection() {        cs = new ClientSocket(ip, port);        cs.createConnection();        Log.d("Main", "连接服务器成功:");        return true;    }    public void onClick(View v) {        start();    }}

 

Android 用Socket实现PC和手机的文件传输