热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

AndroidTCP文件客户端与服务器DEMO介绍

首先是服务器,服务器是在PC机上,JAVA运行环境,主要参考网上的代码,自己做了支持多线程处理,代码如下所示。需要的朋友可以过来参考下,希望对大家有所帮助

主要功能是:

1、TCP服务器提供文件下载服务,服务器支持多线程。

2、TCP Client从服务器上下载指定的文件,Client也支持多线程。

首先是服务器,服务器是在PC机上,JAVA运行环境,主要参考网上的代码,自己做了支持多线程处理,代码如下:

代码如下:

//file:DownloadServer.java
import java.net.*;
import java.io.*;
class ServerOneDownload extends Thread {
    private Socket socket = null;
    private String downloadRoot = null;
    private static final int Buffer = 8 * 1024;
    public ServerOneDownload(Socket socket, String downloadRoot) {
        super();
        this.socket = socket;
        this.downloadRoot = downloadRoot;
        start();
    }
    // 检查文件是否真实存在,核对下载密码,若文件不存在或密码错误,则返回-1,否则返回文件长度
    // 此处只要密码不为空就认为是正确的
    private long getFileLength(String fileName, String password) {
        // 若文件名或密码为null,则返回-1
        if ((fileName == null) || (password == null))
            return -1;
        // 若文件名或密码长度为0,则返回-1
        if ((fileName.length() == 0) || (password.length() == 0))
            return -1;
        String filePath = downloadRoot + fileName; // 生成完整文件路径
        System.out.println("DownloadServer getFileLength----->" + filePath);
        File file = new File(filePath);
        // 若文件不存在,则返回-1
        if (!file.exists())
            return -1;
        return file.length(); // 返回文件长度
    }
    // 用指定输出流发送指定文件
    private void sendFile(DataOutputStream out, String fileName)
            throws Exception {
        String filePath = downloadRoot + fileName; // 生成完整文件路径
        // 创建与该文件关联的文件输入流
        FileInputStream in = new FileInputStream(filePath);
        System.out.println("DownloadServer sendFile----->" + filePath);
        byte[] buf = new byte[Buffer];
        int len;
        // 反复读取该文件中的内容,直到读到的长度为-1
        while ((len = in.read(buf)) >= 0) {
            out.write(buf, 0, len); // 将读到的数据,按读到的长度写入输出流
            out.flush();
        }
        out.close();
        in.close();
    }
    // 提供下载服务
    public void download() throws IOException {
        System.out.println("启动下载... ");
        System.out.println("DownloadServer currentThread--->"
                + currentThread().getName());
        System.out.println("DownloadServer currentThread--->"
                + currentThread().getId());
        // 获取socket的输入流并包装成BufferedReader
        BufferedReader in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        // 获取socket的输出流并包装成DataOutputStream
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        try {
            String parameterString = in.readLine(); // 接收下载请求参数
            // 下载请求参数字符串为自定义的格式,由下载文件相对于下载根目录的路径和
            // 下载密码组成,两者间以字符 "@ "分隔,此处按 "@ "分割下载请求参数字符串
            String[] parameter = parameterString.split("@ ");
            String fileName = parameter[0]; // 获取相对文件路径
            String password = parameter[1]; // 获取下载密码
            // 打印请求下载相关信息
            System.out.print(socket.getInetAddress().getHostAddress()
                    + "提出下载请求, ");
            System.out.println("请求下载文件: " + fileName);
            // 检查文件是否真实存在,核对下载密码,获取文件长度
            long len = getFileLength(fileName, password);
            System.out.println("download fileName----->" + fileName);
            System.out.println("download password----->" + password);
            out.writeLong(len); // 向客户端返回文件大小
            out.flush();
            // 若获取的文件长度大于等于0,则允许下载,否则拒绝下载
            if (len >= 0) {
                System.out.println("允许下载 ");
                System.out.println("正在下载文件 " + fileName + "... ");
                sendFile(out, fileName); // 向客户端发送文件
                System.out.println(fileName +": "+"下载完毕 ");
            } else {
                System.out.println("下载文件不存在或密码错误,拒绝下载! ");
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            socket.close(); // 关闭socket
        }
    }
    @Override
    public void run() {
        try {
            download();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // TODO Auto-generated method stub
        super.run();
    }
}
public class DownloadServer {
    private final static int port = 65525;
    private static String root = "C:// "; // 下载根目录
    public static void main(String[] args) throws IOException {
        String temp = null;
        // 监听端口
        try {
            // 包装标准输入为BufferedReader
            BufferedReader systemIn = new BufferedReader(new InputStreamReader(
                    System.in));
            while (true) {
                System.out.print("请输入下载服务器的下载根目录: ");
                root = systemIn.readLine().trim(); // 从标准输入读取下载根目录
                File file = new File(root);
                // 若该目录确实存在且为目录,则跳出循环
                if ((file.exists()) && (file.isDirectory())) {
                    temp = root.substring(root.length() - 1, root.length());
                    if (!temp.equals("//"))
                        root += "//";
                }
                break;
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server start...");
        try {
            while (true) {
                Socket socket = serverSocket.accept();
                new ServerOneDownload(socket, root);
            }
        } finally {
            serverSocket.close();
        }
    }
}

File Download Client

Client输入IP和文件名即可直接从服务器上下载,还是看代码。

代码如下:

//file:DownLoadClient.java
package org.piaozhiye.study;
import java.io.IOException;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class DownLoadClient extends Activity {
    private Button download = null;
    private EditText et_serverIP = null;
    private EditText et_fileName= null;
    private String downloadFile = null;
    private final static int PORT = 65525;
    private final static String defaultIP = "192.168.0.100";
    private static String serverIP = null;
    private Socket socket;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        download = (Button)findViewById(R.id.download);
        et_serverIP= (EditText)findViewById(R.id.et_serverip);
        et_fileName = (EditText)findViewById(R.id.et_filename);
        et_serverIP.setText("192.168.0.100");

      download.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                 serverIP = et_serverIP.getText().toString();
                 if(serverIP == null){
                     serverIP = defaultIP;
                 }
                 System.out.println("DownLoadClient serverIP--->" + serverIP );
                    System.out.println("DownLoadClient MainThread--->" + Thread.currentThread().getId() );

                try{
                    socket = new Socket(serverIP, PORT);

                }catch(IOException e){

                }
                 downloadFile = et_fileName.getText().toString();
            Thread downFileThread = new Thread(new DownFileThread(socket, downloadFile));
            downFileThread.start();
                System.out.println("DownLoadClient downloadFile--->" + downloadFile );
            }
        });

    }
}

file:DownFileThread.java
代码如下:

package org.piaozhiye.study;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class DownFileThread extends Thread {
    private Socket socket;
    private String downloadFile;
    private final static int Buffer = 8 * 1024;
    public DownFileThread(Socket socket, String downloadFile) {
        super();
        this.socket = socket;
        this.downloadFile = downloadFile;
    }
    public Socket getSocket() {
        return socket;
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
    public String getDownloadFile() {
        return downloadFile;
    }
    public void setDownloadFile(String downloadFile) {
        this.downloadFile = downloadFile;
    }
    // 向服务器提出下载请求,返回下载文件的大小
    private long request(String fileName, String password) throws IOException {
        // 获取socket的输入流并包装成DataInputStream
        DataInputStream in = new DataInputStream(socket.getInputStream());
        // 获取socket的输出流并包装成PrintWriter
        PrintWriter out = new PrintWriter(new OutputStreamWriter(
                socket.getOutputStream()));
        // 生成下载请求字符串
        String requestString = fileName + "@ " + password;
        out.println(requestString); // 发出下载请求
        out.flush();
        return in.readLong(); // 接收并返回下载文件长度
    }
    // 接收并保存文件
    private void receiveFile(String localFile) throws Exception {
        // 获取socket的输入流并包装成BufferedInputStream
        BufferedInputStream in = new BufferedInputStream(
                socket.getInputStream());
        // 获取与指定本地文件关联的文件输出流
        FileOutputStream out = new FileOutputStream(localFile);
        byte[] buf = new byte[Buffer];
        int len;
        // 反复读取该文件中的内容,直到读到的长度为-1
        while ((len = in.read(buf)) >= 0) {
            out.write(buf, 0, len); // 将读到的数据,按读到的长度写入输出流
            out.flush();
        }
        out.close();
        in.close();
    }
    // 从服务器下载文件
    public void download(String downloadFile) throws Exception {
        try {
            String password = "password";
            // String downloadFile ="imissyou.mp3";
            String localpath = "/sdcard/";
            String localFile = localpath + downloadFile;
            long fileLength = request(downloadFile, password);
            // 若获取的文件长度大于等于0,说明允许下载,否则说明拒绝下载
            if (fileLength >= 0) {
                System.out.println("fileLength: " + fileLength + " B");
                System.out.println("downing...");
                receiveFile(localFile); // 从服务器接收文件并保存至本地文件
                System.out.println("file:" + downloadFile + " had save to "
                        + localFile);
            } else {
                System.out.println("download " + downloadFile + " error! ");
            }
        } catch (IOException e) {
            System.out.println(e.toString());
        } finally {
            socket.close(); // 关闭socket
        }
    }
    @Override
    public void run() {
        System.out.println("DownFileThread currentThread--->"
                + DownFileThread.currentThread().getId());
        // TODO Auto-generated method stub
        try {
            download(downloadFile);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        super.run();
    }

}

layout.xml
代码如下:


    android:orientation="vertical"
    android:layout_
    android:layout_
    >
    android:layout_
    android:layout_
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:text="服务器IP:"
    />
        android:id="@+id/et_serverip"
    android:layout_
    android:layout_
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"

    />

        android:layout_
    android:layout_
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:text="下载文件名:"
    />
        android:id="@+id/et_filename"
    android:layout_
    android:layout_
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"

    />
        android:id="@+id/download"
    android:layout_
    android:layout_
    android:text="download"
    />


同时别忘了权限:



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
好运娟_968
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有