0

我有一个 python 套接字服务器,每当收到来自客户端的“发送”时,它就会发送一个 PNG 文件(72755 字节)。客户端python代码接收72755字节并正确保存文件:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send('send')

    f = open('torecv.png','wb')
    l = s.recv(1024)

    while (l):
        f.write(l)
        l = s.recv(1024)
        k = str(l)
        byte_num += len(l)
        if k[-5:-1] == 'done':
            break
    f.write(l[:-4])
    f.close()

    s.close()

但是,在 Swift 中,以下代码总共获得 72755 个字节,并给了我一个损坏的 PNG 文件。谁能告诉我问题出在哪里?谢谢

switch client.connect(timeout: 1) {
  case .success:
    switch client.send(string: "send" ) {
      case .success:
        var dataAll : [UInt8] = []
        while true {
            guard let data = client.read(1024, timeout:1) else { break }
            print("bytes: " + String(data.count))
            if String(bytes: data, encoding: .utf8) == "done" {
                print("done")
            }else{
                dataAll += data
            }
        }
        print(dataAll.count) // prints 72755
        
        let img : Data = Data(bytes: dataAll, count: dataAll.count)
        writeToFile(data: img, fileName: "testPng")

编辑:问题可能在于保存 PNG 文件(Python 和 Swift 都正确获取所有字节)

    func writeToFile(data: Data, fileName: String){
        // get path of directory
        guard let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else {
            return
        }
        // create file url
        let fileurl =  directory.appendingPathComponent("\(fileName).png")
        print(fileurl)
    // if file exists then write data
        if FileManager.default.fileExists(atPath: fileurl.path) {
            if let fileHandle = FileHandle(forWritingAtPath: fileurl.path) {
                // seekToEndOfFile, writes data at the last of file(appends not override)
                fileHandle.seekToEndOfFile()
                fileHandle.write(data)
                fileHandle.closeFile()
                
                var yourImage: UIImage = UIImage(named: fileurl.path)!
                testImg.image = yourImage
                
            }
            else {
                print("Can't open file to write.")
            }
        }
        else {
            // if file does not exist write data for the first time
            do{
                try data.write(to: fileurl, options: .atomic)
            }catch {
                print("Unable to write in new file.")
            }
        }

    }

主图像和 Python 获得的内容:

在此处输入图像描述

斯威夫特得到什么:

在此处输入图像描述

4

0 回答 0