Ios 在Swift中实现FTP文件传输(STOR)?

Ios 在Swift中实现FTP文件传输(STOR)?,ios,swift,sockets,ftp,Ios,Swift,Sockets,Ftp,我正在开发一个用Swift编写的客户端iOS应用程序,它允许用户在FTP服务器上传输文件。我知道苹果公司提供了API来实现这一点,但它们自2016年以来就被弃用了,我需要一个替代方案。我也知道FTP是不安全的,但我必须这样做。我的目标是通过服务器打开一个套接字并向其发送命令以传输文件。我在用,但我拿不到。这是我的密码: do { let socket = try Socket.create() try socket.connect(to:

我正在开发一个用Swift编写的客户端iOS应用程序,它允许用户在FTP服务器上传输文件。我知道苹果公司提供了API来实现这一点,但它们自2016年以来就被弃用了,我需要一个替代方案。我也知道FTP是不安全的,但我必须这样做。我的目标是通过服务器打开一个套接字并向其发送命令以传输文件。我在用,但我拿不到。这是我的密码:

do {
    let socket = try Socket.create()
                    
    try socket.connect(to: "127.0.0.1", port: 21)
    let answer = try socket.readString()
    print(answer!)
                    
    try socket.write(from: "USER test\r\n")
    let userAnswer = try socket.readString()
    print(userAnswer!)
                    
    try socket.write(from: "PASS 0000\r\n")
    let passwordAnswer = try socket.readString()
    print(passwordAnswer!)
                    
    try socket.write(from: "PASV\r\n")
    let passiveModeAnswer = try socket.readString()
    print(passiveModeAnswer!)
                    
    try socket.write(from: "STOR myFile.txt\r\n")
    let storAnswer = try socket.readString()
    print(storAnswer!)

    /* CODE FOR SENDING FILE BELOW */

} catch let error as NSError {
    print(error.debugDescription)
}
我目前正在本地服务器上工作,并成功登录。服务器已准备好接受数据。我在控制台中看到:

150 Ok to receive data.
以下是我用来发送文件的代码:

guard let path = Bundle.main.path(forResource: "myFile", ofType: "txt"),
      let fileInputStream = InputStream(fileAtPath: path) 
else {
    return
}
            
fileInputStream.open()

var buffer = [UInt8](repeating: 0, count: 1024)
var bytesRead = 0
var fileData = Data()

while fileInputStream.hasBytesAvailable {
    bytesRead = fileInputStream.read(&buffer, maxLength: buffer.count)
    fileData.append(buffer, count: bytesRead)
}

try socket.write(from: fileData)
let fileAnswer = try socket.readString()
print(fileAnswer!)

fileInputStream.close()
socket.close()
执行后,我在本地服务器中看到“myFile.txt”,但它是空的。原始文件存储在Xcode中:它是一个13字节的文件(一个简单的文本文件)。我看到一个断点,
bytesRead
变为13,
fileData
被赋值。在执行
try socket.write(from:fileData)
指令后,我没有收到来自套接字的任何响应,但只有以下错误消息:
错误代码:-9982(0x-26FE),系统调用中断
。有什么遗漏或错误吗?我在实现目标方面做得好吗


正如Martin正确地说的,我已经解析了PASV答案的结果,下面是代码:

guard let path = Bundle.main.path(forResource: "myFile", ofType: "txt"),
      let fileInputStream = InputStream(fileAtPath: path) 
else {
    return
}
            
fileInputStream.open()
            
guard let pasvAnswer = passiveModeAnswer else {
    return
}
            
var editedAnswer = String(pasvAnswer.dropFirst(26))
editedAnswer = editedAnswer.replacingOccurrences(of: ")", with: "")
editedAnswer = editedAnswer.replacingOccurrences(of: "(", with: "")
editedAnswer = editedAnswer.replacingOccurrences(of: ",", with: ".")
editedAnswer = String(editedAnswer.dropLast())
let cmps = editedAnswer.components(separatedBy: ".")
            
let dataHost = cmps[0] + "." + cmps[1] + "." + cmps[2] + "." + cmps[3]
let dataPort = ((Int(cmps[4]))!<<8) + Int(cmps[5])!
            
print("dataHost: \(dataHost), dataPort: \(dataPort)")
            
try socket.write(from: "STOR myFile.txt\r\n")
let storAnswer = try socket.readString()
print(storAnswer!)
            
let dataSocket = try Socket.create()
try dataSocket.connect(to: dataHost, port: Int32(dataPort))
            
var buffer = [UInt8](repeating: 0, count: 1024)
var bytesRead = 0
var fileData = Data()

while fileInputStream.hasBytesAvailable {
    bytesRead = fileInputStream.read(&buffer, maxLength: buffer.count)
    fileData.append(buffer, count: bytesRead)
}
            
try dataSocket.write(from: fileData)
let fileAnswer = try dataSocket.readString()
print(fileAnswer!)
            
fileInputStream.close()
dataSocket.close()
socket.close()
guard let path=Bundle.main.path(forResource:“myFile”,类型:“txt”),
让fileInputStream=InputStream(fileAtPath:path)
否则{
返回
}
fileInputStream.open()文件
guard let pasvAnswer=被动拒绝其他{
返回
}
var editedAnswer=String(pasvAnswer.dropFirst(26))
editedAnswer=editedAnswer.replacingOccurrences(of:“)”,带:“”)
editedAnswer=editedAnswer.replacingOccurrences(of:(“,with:”)
editedAnswer=editedAnswer.replacingOccurrences(of:“,”,with:“.”)
editedAnswer=字符串(editedAnswer.dropLast())
设cmps=editedAnswer.components(以“.”分隔)
让dataHost=cmps[0]+“+cmps[1]+”+cmps[2]+“+cmps[3]

让dataPort=((Int(cmps[4]))!您必须解析
PASV
响应(
passiveModeAnswer
),然后连接到提供的IP地址和端口,并将文件内容发送到新连接