Socket通信之获取服务器端文件列表点击下载

客户端读取服务器端的文件目录,自主选择进行下载。(AS实现)

1.Manifest添加权限


与之前博文相同,不再赘述。详见:

Socket通信-CSDN博客文章浏览阅读272次,点赞4次,收藏10次。套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。socket通信只能在同一子网下,也就是说两个手机(Android设备)必须连接同一WIFI,不能说一个手机连着WIFI,一个手机用流量。分客户端与服务端,Socket以服务端的ip地址和定好的端口号进行组合得到套接字进行两端的相互连接,达到能够互相收发消息的目的。首先需要创建两个app工程,一个作为客户端,一个作为服务器端。https://blog.csdn.net/m0_65627943/article/details/135881909?spm=1001.2014.3001.5501

2.客户端


执行过程:
1.    打开客户端后,点击“连接”按钮,发送连接请求并发送读取服务器文件列表消息给服务器,然后服务器把文件列表返回,客户端再在界面上显示。之后客户端可进行下载操作。
2.    为了能方便服务器识别客户端消息的类型然后进行相应处理,简单规范化双方通信协议。通信格式如下: 

关键代码块:

 

完整代码:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button refresh;
    private Button commit;
    private Button connect;
    private TextView textProgress;
    private TextView commitProgress;
    private RecyclerView recyclerView;
    Thread Thread1 = null;

    private File currentUpploadFile;
    private String downloadSavePath = "sdcard/Movies";

    private Socket client_socket;
    private PrintStream client_out;
    private BufferedReader client_in;
    private String ip = "192.168.236.147";
    private int port = 5203;

    private List<String> mData;
    private FileListAdapter fileListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        initView();

        //初始化数据
        mData = new ArrayList<>();

        //连接服务器
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Thread1 = new Thread(new Thread1());
                Thread1.start();
            }
        });


        //刷新文件列表
        refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO: 2024/2/2  
            }
        });

//        //设置Adapter和LayoutManager布局管理器
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

    }

    /**
     * 初始化view
     */
    private void initView() {
        refresh = findViewById(R.id.refresh);
        commit = findViewById(R.id.commit);
        connect = findViewById(R.id.connect);
        textProgress = findViewById(R.id.text_progress);
        commitProgress = findViewById(R.id.commit_progress);
        recyclerView = findViewById(R.id.recycler_view);
    }

    /**
     * 连接服务器
     */
    class Thread1 implements Runnable {

        @Override
        public void run() {
            try {
                client_socket = new Socket(ip, port);//建立连接

                client_out = new PrintStream(client_socket.getOutputStream(), true);
                client_in = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));

                //读取文件列表
                client_out.println("@action=loadFileList");

                Log.d(TAG, "run: Connected");

                //开启线程监听服务器消息
                new ClientThread().start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * item点击监听向服务器请求下载
     */
    
    class downThread implements Runnable {

        private List<String> data;
        private int position;

        downThread(List<String> data, int i) {
            this.data = data;
            this.position = i;
        }

        @Override
        public void run() {
            //向服务器请求下载
            client_out.println("@action=Download[" + mData.get(position) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

乘方计算 T1062

#include<bits/stdc.h> using namespace std; int a,n, power1; int main(){cin>>a>>n;for(int i1;i<n;i){power*a;}cout<<power<<endl;return 0; }

【Docker】网络配置network详解

一&#xff0c;network的概述 解决痛点&#xff08;能干什么&#xff1f;&#xff09;&#xff1a; &#xff08;1&#xff09;容器间的互联和通信以及端口映射 &#xff08;2&#xff09;容器IP变动时候&#xff0c;可以通过服务名直接网络通信而不受到影响 二&#xff0c;n…

小白水平理解面试经典题目_数组类Leetcode 412. Fizz Buzz【数学解法】

412 FizzBuzz 小白渣翻译&#xff1a; 给定一个整数 n &#xff0c;返回一个字符串数组 answer &#xff08;从 1 开始索引&#xff09;&#xff0c;其中&#xff1a; answer[i] “FizzBuzz” 如果 i 能被 3 和 5 整除。answer[i] “Fizz” 如果 i 能被 3 整除。answer[i]…

大数据信用报告查询费用一般要多少钱?

一些不少朋友在申贷的时候被拒贷之后&#xff0c;得到的原因就是因为大数据不良被拒&#xff0c;这时候很多人都反过来查询自己的大数据信用报告&#xff0c;而查询的价格也是不少朋友都比较关注的&#xff0c;那大数据信用报告查询费用一般要多少钱呢?下面本文就为你介绍一下…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件&#xff1a;子组件A&#xff1a;子组件B&#xff1a;eventbus/index.js&#xff1a; EventBus的基本使用方法&#xff1a; 示例背景 在Vue中&#xff0c;使用EventBus可以实现组件…

flask基于Python的期货交易模拟系统的django-afl61-vue

期货交易模拟系统是一个便于用户在线查看期货投资、取消投资、风险控制、账户资金、持仓资金等&#xff0c;管理员进行管理的平台。因此本文主要论述了系统开发的过程和实现的功能&#xff0c;结合Web技术来实现的期货交易模拟系统。本系统以软件工程理论为开发基础&#xff0c…

【差分数组 区间的综合用例】

根据前面两篇文章 区间合并 差分数组 对差分数组和合并区间的介绍&#xff0c;以下是两道相关的例题&#xff0c;其中综合题融合了区间合并和差分数组&#xff0c;非常经典&#xff0c;也有点难度&#xff0c;值得仔细琢磨 最合适的价格 &#xff08;差分数组&#xff09; 给…

Java线程是怎么实现run方法的执行的呢?【 多线程在JVM中的实现原理剖析】

Java线程是怎么实现run方法的执行的呢&#xff1f;【 多线程在JVM中的实现原理剖析】 查看naive state0 方法JVM_StartThread 方法创建操作系统线程操作系统线程执行 本文转载-极客时间 我们知道Java线程是通过行start()方法来启动的&#xff0c;线程启动后会执行run方法内的代…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器&#xff09; 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

Python使用分治算法作归并排序

对于分治算法的一个较为常规的应用中&#xff0c;归并排序是一个使用分治算法的排序方式。给定一个随机排序的数组&#xff0c;我们要将其元素按照升序或者降序的方式进行排序&#xff0c;可以设想到这样的一种算法&#xff0c;如果一个数组的上半部分和下半部分已经排好序&…

Vue打包Webpack源码及物理路径泄漏问题解决

修复前&#xff1a; 找到vue.config.js文件&#xff0c;在其中增加配置 module.exports {productionSourceMap: false,// webpack 配置configureWebpack: {devtool: false,}}其中打包的物理路径泄露我这边试了好多次&#xff0c;发现只有打包的时候NODE_ENVproduction 才能保…

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块&#xff1a;第三节 JSP四大域对象 一、page范围二、request范围三、session范围四、application范围 在服务器和客户端之间、各个网页之间、哪怕同一个网页之内&#xff0c;总是需要传递各种参数值&#xff0c;这时JSP的内置对象就是传递这些参数的载具。内置对象…

Iceberg从入门到精通系列之二十三:Spark查询

Iceberg从入门到精通系列之二十三&#xff1a;Spark查询 一、使用 SQL 查询二、使用 DataFrame 进行查询三、Time travel四.Incremental read五、检查表六、History七、元数据日志条目八、Snapshots九、Files十、Manifests十一、Partitions十二、所有元数据表十三、参考十四、使…

泰克示波器(TBS2000系列)触发功能使用讲解——边沿触发

# Trigger区域 触发区域用于对触发功能进行配置。示波器的触发功能用于采集&#xff08;Acquire&#xff09;那些在瞬间出现的信号&#xff0c;便于我们分析观察&#xff0c;此时可以当做逻辑分析仪使用。触发区域按钮包括&#xff1a;menu、Level\Force Trig三个。 目录 1.1 …

【机器学习 深度学习】卷积神经网络简述

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

telnet笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、场景二、介绍1.测试端口2.访问百度3. 简单的爬虫 前言 最近telnet命令用的比较多&#xff0c;所以记录一下。 一、场景 ping应该是大家最常用的命令&…

unity角色触摸转向

1、挂载脚本到角色的父物体A上 2 、以屏幕左边的触摸为移动&#xff0c;右边为转向操作 3、加载角色时&#xff0c;将角色的父物体设置为A&#xff0c;须将角色的位置和角度置0 using System; using System.Collections; using System.Collections.Generic; using UnityEngin…

python之组合数据类型-字典dict

字典 字典的定义与特点操作字典创建字典字典的增删改查添加键值对删除键值对修改键值对访问元素 遍历字典 嵌套 字典的定义与特点 字典&#xff1a;字典是一系列键值对&#xff0c;是一种无序的数据集合&#xff0c;它是通过键来访问的&#xff0c;而不是索引 字典的特点&#…

【Go语言成长之路】安装Go

文章目录 安装Go一、下载Go语言安装包二、删除以前安装的Go版本三、添加/usr/local/go/bin到环境变量内四、确认安装成功 安装Go Note: 这里只演示安装Linux版本的Go&#xff0c;若为其它版本&#xff0c;请按照官网的安装教程进行安装即可。 一、下载Go语言安装包 ​ 在浏览…

Unity | Spine动画记录

https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 1.需要的三个文件 通常制作好的 Spine 动画导出时会有三个文件&#xff1a; .png 、.json 和 .atlas&#xff1a; skeleton-name.json 或 skeleton-…