zoukankan      html  css  js  c++  java
  • Android 用Socket实现PC和手机的文件传输

    PC服务器端代码:

    /*
     * PC与<a href="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://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://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://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://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://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://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://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();
        }
    }
  • 相关阅读:
    mysql密码忘记如何恢复(windows/liunx版本:mysql8.0.27)
    Visual Studio Code如何校验yaml格式文件
    python测试小工具
    Lunx vimgo 开发环境搭建
    小白学正则表达式之 regexp
    kubernetes scc 故障排查小记
    Go image registry
    OpenShift image registry 概述
    Go 疑难杂症汇总
    小白学标准库之 http
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7143739.html
Copyright © 2011-2022 走看看