安卓访问服务器文件,Android socket如何实现文件列表动态访问

d724159129ef841dfa96f05c3450679c.gif

idea服务端更新

c1572585d9cc9b7d82dbb071844a8a91.png

为了防止代码量上升可能带来的结构杂乱,我们对服务端架构进行优化,server包负责socket服务基础实现,data包负责处理各种安卓端的命令。

将readSocketMsg,writeBackMsg方法单独拿出,创建一个SocketMsg方法类,专门负责数据流的读取与写入。

SocketMsg.java

package lrz.server;

import java.io.*;

import java.net.Socket;

import java.util.ArrayList;

public class SocketMsg {

public static ArrayList readSocketMsg(Socket socket) throws IOException {

ArrayList msgList=new ArrayList();

InputStream inputStream = socket.getInputStream();

InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");

BufferedReader bufferedReader=new BufferedReader(reader);

String lineNumStr = bufferedReader.readLine();

int lineNum=Integer.parseInt(lineNumStr);

for(int i=0;i

String str = bufferedReader.readLine();

msgList.add(str);

}

//读取结束后,输入流不能关闭,此时关闭,会将socket关闭,从而导致后续对socket写操作无法实现

return msgList;

}

public static void writeBackMsg(Socket socket, ArrayList msgBackList) throws IOException {

BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream());

OutputStreamWriter writer=new OutputStreamWriter(os,"UTF-8");

writer.write(""+msgBackList.size()+"\n"); //未真正写入的输出流,仅仅在内存中

writer.flush(); //写入输出流,真正将数据传输出去

for(int i=0;i

writer.write(msgBackList.get(i)+"\n");

writer.flush();

}

}

}

创建NetFileData.java作为文件夹访问的方法类,将exeDir()方法放入其中。

NetFileData.java

package lrz.data;

import java.io.File;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

public class NetFileData {

public static ArrayList exeDir(String cmdBody) throws Exception {

// TODO Auto-generated method stub

ArrayList backList=new ArrayList();

File file = new File(cmdBody);

File[] listFiles = file.listFiles();

for(File mfile:listFiles){

String fileName = mfile.getName();

long lastModified = mfile.lastModified();//获取文件修改时间

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//给时间格式,例如:2018-03-16 09:50:23

String fileDate = dateFormat.format(new Date(lastModified));//取得文件最后修改时间,并按格式转为字符串

String fileSize="0";

String isDir="1";

if(!mfile.isDirectory()){//判断是否为目录

isDir="0";

fileSize=""+mfile.length();

}

backList.add(fileName+">"+fileDate+">"+fileSize+">"+isDir+">");

}

return backList;

}

}

ServerSocket01.java主函数则将以上方法移除,改为调用

package lrz.server;

import lrz.data.NetFileData;

import java.io.*;

import java.net.InetAddress;

import java.net.NetworkInterface;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.Enumeration;

public class ServerSocket01 {

int port = 8019;// 自定义一个端口,端口号尽可能挑选一些不被其他服务占用的端口,祥见http://blog.csdn.net/hsj521li/article/details/7678880

static int connect_count = 0;// 连接次数统计

ArrayList msgBackList;

public ServerSocket01() {

// TODO Auto-generated constructor stub

}

public ServerSocket01(int port) {

super();

this.port = port;

}

private void printLocalIp(ServerSocket serverSocket) {// 枚举打印服务端的IP

try {

System.out.println("服务端命令端口prot=" + serverSocket.getLocalPort());

Enumeration interfaces = null;

interfaces = NetworkInterface.getNetworkInterfaces();

while (interfaces.hasMoreElements()) {

NetworkInterface ni = interfaces.nextElement();

Enumeration addresss = ni.getInetAddresses();

while (addresss.hasMoreElements()) {

InetAddress nextElement = addresss.nextElement();

String hostAddress = nextElement.getHostAddress();

System.out.println("本机IP地址为:" + hostAddress);

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void work() throws IOException {

// 注意:由于Socket的工作是阻塞式,Android端Socket的工作必须在新的线程中实现,若在UI主线程中工作会报错

ServerSocket serverSocket = new ServerSocket(port);

printLocalIp(serverSocket);

while (true) {// 无限循环,使之能结束当前socket服务后,准备下一次socket服务

System.out.println("Waiting client to connect.....");

Socket socket = serverSocket.accept();// 阻塞式,直到有客户端连接进来,才会继续往下执行,否则一直停留在此代码

System.out.println("Client connected from: "

+ socket.getRemoteSocketAddress().toString());

ArrayList cmdList= SocketMsg.readSocketMsg(socket);

cmdList.forEach(s -> System.out.println(s));

String cmdbody=cmdList.get(0);

try {

msgBackList= NetFileData.exeDir(cmdbody);

} catch (Exception e) {

e.printStackTrace();

}

msgBackList.forEach(s -> System.out.println(s));

SocketMsg.writeBackMsg(socket,msgBackList);

socket.close();

System.out.println("当前Socket服务结束");

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

new ServerSocket01().work();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

安卓端更新

使用listview显示文件夹内容,并且实现动态访问。

MainActivity.java更新了简单的listview显示,设立互动事件,在点击某个列表部分时向服务端发动指定命令,返回结果后更新列表,实现互动效果。

package com.example.android_app;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import androidx.annotation.NonNull;

import android.os.Build;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

public static final String KEY_SERVER_ACK_MSG = "KEY_SERVER_ACK_MSG";

private Handler handler = null;

EditText url,way,dir;

ListView lv;

Button submit;

SocketClient socketClient=null;

String here;

ArrayList data;

int port;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

url=findViewById(R.id.url);

way=findViewById(R.id.way);

dir=findViewById(R.id.dir);

lv=findViewById(R.id.listview);

submit=findViewById(R.id.submit);

handler=new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(@NonNull Message msg) {

Bundle data_bundle = msg.getData();

data=data_bundle.getStringArrayList(KEY_SERVER_ACK_MSG);

data=dataMaker();

printAdapter(data);

return false; }

});

submit.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

port=Integer.parseInt(way.getText().toString());

here=dir.getText().toString();

getdata();

}

});

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

here=here+"/"+data.get(position);

getdata();

}

});

}

private void getdata() {

socketClient=new SocketClient(url.getText().toString(),port,handler);

socketClient.work(here);

}

private ArrayList dataMaker() {

ArrayList dataResult=new ArrayList<>();

int i=data.size();

for (int j = 0; j

String str=data.get(j);

str=str.substring(0,str.indexOf(">"));

dataResult.add(str);

}

return dataResult;

}

private void printAdapter(ArrayList data) {

ArrayAdapter arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);

lv.setAdapter(arrayAdapter);

}

}

SocketClient.java无变动

activity_main.xml布局添加listview,代替原先的textview

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="3"

android:id="@+id/url"

android:text="服务端ip"/>

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="3"

android:id="@+id/way"

android:text="8019"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/dir"

android:text="d://"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="submit"

android:id="@+id/submit"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/listview"/>

补充一点:

安卓端访问的ip在服务端中查看,ip为服务端网络ip,我是红色圈中的,可以都试一下,一般都是倒数第二个长得像ip的这个,port在服务端主函数中设置,可以是任何数,8019为常用端

ae268481c89946e35487940f63d68a42.png

以上就是Android socket如何实现文件列表动态访问的详细内容,更多关于Android socket实现列表动态访问的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio实现Socket服务器需要以下几个步骤: 1. 创建一个Android项目:打开Android Studio,点击“创建新项目”。按照向导选择项目的名称、包名等信息,并选择一个适合的最低API级别。 2. 添加权限:在项目的AndroidManifest.xml文件中,添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` 这些权限是为了允许应用程序进行网络通信。 3. 创建Socket服务器:在项目的Activity或者Service中,创建Socket服务器的实例,并指定一个监听端口。例如: ``` ServerSocket serverSocket = new ServerSocket(8080); ``` 这里创建了一个监听端口为8080的ServerSocket实例。 4. 接收客户端连接:使用serverSocket对象的accept()方法等待客户端连接,并返回一个Socket对象。例如: ``` Socket clientSocket = serverSocket.accept(); ``` 这里通过accept()方法等待客户端连接,并返回与客户端通信的Socket对象。 5. 处理客户端请求:通过输入流和输出流与客户端进行通信,可以使用Socket对象的getInputStream()方法获取输入流,并使用getOutputStream()方法获取输出流。例如: ``` InputStream inputStream = clientSocket.getInputStream(); OutputStream outputStream = clientSocket.getOutputStream(); ``` 通过输入流和输出流,可以读取和写入客户端发送和接收的数据。 6. 关闭Socket连接:在通信结束后,需要关闭Socket连接以及ServerSocket。例如: ``` clientSocket.close(); serverSocket.close(); ``` 以上就是使用Android Studio实现Socket服务器的基本步骤。当然,实际的服务器可能需要更多的操作和安全性措施,比如多线程处理客户端连接、异常处理等。 ### 回答2: Android Studio是一个非常强大的开发工具,可以用来实现Socket服务器。要在Android Studio中实现Socket服务器,你需要按照以下步骤进行操作: 1. 创建一个新的Android项目:打开Android Studio,点击菜单栏中的“File”,然后选择“New”和“New Project”。在弹出的对话框中,填写项目的名称和位置,并选择合适的项目模板。点击“Next”按钮,然后按照向导进行设置,最后点击“Finish”。 2. 添加网络权限:在项目的AndroidManifest.xml文件中,添加以下代码,以获取网络访问权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 3. 创建Socket服务器:在Android项目中的MainActivity类中创建一个Socket服务器。以下是一个简单的示例代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class MainActivity extends AppCompatActivity { private ServerSocket serverSocket; private Socket clientSocket; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // 创建ServerSocket对象,并指定端口号 serverSocket = new ServerSocket(8888); // 接受客户端的连接 clientSocket = serverSocket.accept(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); try { // 关闭Socket连接和ServerSocket if (clientSocket != null) clientSocket.close(); if (serverSocket != null) serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码中,我们创建了一个ServerSocket对象并指定端口号为8888,然后调用accept()方法等待客户端的连接。当客户端连接后,可以在clientSocket对象上进行操作。 4. 运行和测试:将Android设备或模拟器与Android Studio连接,然后点击Android Studio工具栏中的“Run”按钮。这将编译并运行你的Socket服务器应用。 以上就是在Android Studio中实现Socket服务器的简单步骤。当然,在实际应用中,你还需要添加更多的逻辑和处理来确保服务器的稳定运行和数据交互。 ### 回答3: 在Android Studio中实现Socket服务器,首先需要新建一个Android项目。 1. 打开Android Studio,点击"Start a new Android Studio project",选择一个项目名称和位置,并选择一个最低支持的Android版本。 2. 在创建的项目中,打开"MainActivity.java"文件,添加以下代码: ```java import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class MainActivity extends AppCompatActivity { private ServerSocket serverSocket; private Socket clientSocket; private InputStream inputStream; private OutputStream outputStream; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建一个新的线程 Thread thread = new Thread(new Runnable() { @Override public void run() { // 启动服务器 try { serverSocket = new ServerSocket(1234); clientSocket = serverSocket.accept(); inputStream = clientSocket.getInputStream(); outputStream = clientSocket.getOutputStream(); // 在这里可以进行Socket通信的相关操作 // 关闭连接 inputStream.close(); outputStream.close(); clientSocket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }); // 启动线程 thread.start(); } } ``` 上述代码中,我们在`onCreate()`方法中创建了一个新的线程,并在该线程内创建了一个`ServerSocket`,并开始监听连接请求。当接收到连接请求后,我们可以通过获取`InputStream`和`OutputStream`对象来进行Socket通信。这里只是简单创建了Socket服务器,并未实际进行通信。 3. 运行项目,点击运行按钮,选择一个模拟器或真机进行安装和运行。 以上就是使用Android Studio实现Socket服务器的简单示例。在实际使用中,可以根据需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值