android端通过Socket文件上传

1、Socket文件上传演示场景:一个手机作为发送端、一个手机作为接收端、两部手机在同一wifi网络环境下。

github源码地址,可以下载对照着看。

2、首先用一部手机来创建并启动接收端的Socket服务。部分代码:

  • 1、创建服务端ServerSocket,接收文本信息。
/**
     * 创建服务端ServerSocket
     * 接收文本消息
     */
    private void createStringServerSocket() {
        Runnable run = new Runnable() {
            @Override
            public void run() {
                Bundle bundle = new Bundle();
                bundle.clear();
                OutputStream out;
                //给发送端返回一个消息,告诉他链接接收成功。
                String str = "200";
                try {
                    ServerSocket serverSocket = new ServerSocket(StringProt);
                    while (true) {
                        try {
                            //此处是线程阻塞的,所以需要在子线程中
                            Socket socket = serverSocket.accept();
                            //请求成功,响应客户端的请求
                            out = socket.getOutputStream();
                            out.write(str.getBytes("utf-8"));
                            out.flush();
                            socket.shutdownOutput();
                            //获取输入流,读取客户端发送来的文本消息
                            BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            String line = null;
                            while ((line = bff.readLine()) != null) {
                                buffer.append(line);
                            }
                            buffer.append("\n");
                            //
                            handler.sendEmptyMessage(1);
                            bff.close();
                            out.close();
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        };
        executorService.execute(run);
    }
  • 2、创建服务端ServerSocket,接收文件。
/**
     * 创建服务端ServerSocket
     * 接收文件
     */
    private void createFileServerSocket() {
        Runnable run = new Runnable() {
            @Override
            public void run() {
                //给发送端返回一个消息,告诉他链接接收成功。
                String str = "200";
                try {
                    ServerSocket serverSocket = new ServerSocket(FileProt);
                    while (true) {
                        try {
                            //此处是线程阻塞的,所以需要在子线程中
                            Socket socket = serverSocket.accept();
                            //请求成功,响应客户端的请求
                            OutputStream out = socket.getOutputStream();
                            out.write(str.getBytes("utf-8"));
                            out.flush();
                            socket.shutdownOutput();
                            //获取输入流,读取客户端发送来的文件
                            DataInputStream dis = new DataInputStream(socket.getInputStream());
                            // 文件名和长度
                            String fileName = dis.readUTF();
                            //接收到的文件要存储的位置
                            File directory = new File(sdPath + "/imgage/");
                            if (!directory.exists()) {
                                directory.mkdirs();
                            }
                            FileOutputStream fos = new FileOutputStream(directory.getAbsolutePath() + "/" + fileName);
                            // 开始接收文件
                            byte[] bytes = new byte[1024];
                            int length = 0;
                            while ((length = dis.read(bytes, 0, bytes.length)) != -1) {
                                fos.write(bytes, 0, length);
                                fos.flush();
                            }
                            dis.close();
                            fos.close();
                            out.close();
                            socket.close();
                            handler.sendEmptyMessage(3);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        };
        executorService.execute(run);
    }

3、用另一部手机,再来创建并启动发送端的Socket。部分代码:

  • 1、启动线程 向服务器发送文本消息
/**
     * 启动线程 向服务器发送文本消息
     */
    private void sendStringMessage(final String txt1, final String ip) {
        Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket();
                    //端口号为StringProt
                    socket.connect(new InetSocketAddress(ip, StringProt));
                    //获取输出流
                    OutputStream ou = socket.getOutputStream();
                    //读取服务器响应
                    BufferedReader bff = new BufferedReader(new InputStreamReader(
                            socket.getInputStream()));
                    String line = null;
                    String buffer = "";
                    while ((line = bff.readLine()) != null) {
                        buffer = line + buffer;
                    }
                    //向服务器发送文本信息
                    ou.write(txt1.getBytes("utf-8"));
                    //关闭各种输入输出流
                    ou.flush();
                    bff.close();
                    ou.close();
                    socket.close();
                    //服务器返回
                    Message message = new Message();
                    message.what = 2;
                    message.obj = buffer;
                    handler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        executorService.execute(run);
    }
  • 2、启动线程 向服务器发送文件
/**
     * 启动线程 向服务器发送文件
     */
    private void sendFileMessage(final String fliePath, final String ip) {
        Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket();
                    socket.connect(new InetSocketAddress(ip, FileProt));
                    //获取输出流
                    OutputStream ou = socket.getOutputStream();
                    //读取服务器响应
                    BufferedReader bff = new BufferedReader(new InputStreamReader(
                            socket.getInputStream()));
                    String line = null;
                    String buffer = "";
                    while ((line = bff.readLine()) != null) {
                        buffer = line + buffer;
                    }
                    //向服务器发送文件
                    File file = new File(fliePath);
                    if (file.exists()) {
                        FileInputStream fileInput = new FileInputStream(fliePath);
                        DataOutputStream dos = new DataOutputStream(ou);
                        // 文件名
                        dos.writeUTF(file.getName());
                        byte[] bytes = new byte[1024];
                        int length = 0;
                        while ((length = fileInput.read(bytes)) != -1) {
                            dos.write(bytes, 0, length);
                        }
                        //告诉服务端,文件已传输完毕
                        socket.shutdownOutput();
                        fileInput.close();
                        dos.close();
                        //服务器返回码
                        Message message = new Message();
                        message.what = 2;
                        message.obj = buffer;
                        handler.sendMessage(message);
                    }
                    //关闭各种输入输出流
                    ou.flush();
                    bff.close();
                    ou.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        executorService.execute(run);
    }

4、OK,上面只是一部分代码,完整的demo在上面有链接。注意,两部手机必须要在同一wifi网络环境下。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的铅笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值