EPERM 通过 apache commons net ftp 使用网络套接字

问题描述 投票:0回答:1

我正在导入 apache commons net ftp 客户端

import org.apache.commons.net.ftp.FTP
import org.apache.commons.net.ftp.FTPClient

我尝试执行 ftp.connect() 函数

    val ftp = FTPClient()
    ftp.connect(localAddress, port)
    Log.w("FTP", "connected")

ftp.connect()
会导致长堆栈跟踪异常。

但主要是这一行似乎是问题所在:

 Caused by: java.net.SocketException: socket failed: EPERM (Operation not permitted)

所以我已添加到我的清单中:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

但错误仍然存在。

我已阅读这些权限的文档:

https://developer.android.com/develop/connectivity/network-ops/connecting

似乎我已经完成了所有需要做的事情,但我仍然不断收到 EPERM 操作不允许的错误。

任何帮助和指导将不胜感激,我对此很陌生,所以也许我错过了一些简单的东西。

我的应用目标设备运行的是 Android 13。

android kotlin android-studio
1个回答
0
投票

在我看来,该解决方案取决于以下几点:

  1. 将适当的使用权限放入清单中。无需在运行时询问。

  2. 确保服务器端有可用的侦听器。

  3. Android 要求 ftp.connect 在与主线程分开的单独线程上运行。对我来说以下工作有效:

     suspend fun networkReq() =
         withContext(Dispatchers.IO) {
    
             val ftp = FTPClient()
             try {
                 ftp.connect(server_ip, server_port)
             } catch (e: Exception) {
                 e.printStackTrace()
             }
             Log.w("FTP", "connected")
    
         }
    
    
     lifecycleScope.launch {
         launch {
             networkReq()
         }
     }
    
© www.soinside.com 2019 - 2024. All rights reserved.