我有一个 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 获得的内容:
斯威夫特得到什么:

