我正在尝试通过socket.io
将我的nodejs服务器上的图像发送到iOS客户端我在服务器端使用socket.io,在客户端使用socket.io-client-swift。
我发送的二进制数据如下:
socket.on("getPhoto") { data,ack in
let tmp = data[0] as? NSArray
let buffer = tmp![1] as? NSData
if (buffer != nil) {
let img = UIImage(data: buffer!)
self.setImage!(img!)
}
}
与http://socket.io/blog/introducing-socket-io-1-0/#binary
中记载的一样但我的问题是我不知道如何在客户端处理数据。
我已经尝试将其强制转换为NSInputStream,但它会在此处出现转换错误。
在我的客户端,我正在这样做:
for v in volumes:
print(v.id)
如何从此流中获取图像?
感谢您的帮助
答案 0 :(得分:0)
你有没有试过像:
deviceInfoModelList = new ArrayList<>();
for(int i=0;i<jsonArrayResponse.length();i++){
JSONObject jsonObject = jsonArrayResponse.getJSONObject(i);
DeviceInfoModel deviceInfoModel = new DeviceInfoModel();
deviceInfoModel.setDeviceID(jsonObject.getString("deviceID"));
JSONArray deviceDetailsJsonArray = jsonObject.getJSONArray("deviceDetails");
ArrayList<DeviceDetailsModel> deviceDetailsModelList = new ArrayList<>();
for(int j=0;j<deviceDetailsJsonArray.length();j++){
JSONObject deviceDetailsJsonObj = deviceDetailsJsonArray.getJSONObject(j);
DeviceDetailsModel deviceDetailsModel = new DeviceDetailsModel();
deviceDetailsModel.setDeviceID(deviceDetailsJsonObj.getString("accountID"));
deviceDetailsModel.setAccountID(deviceDetailsJsonObj.getString("deviceID"));
deviceDetailsModel.setTimestamp(deviceDetailsJsonObj.getString("timestamp"));
deviceDetailsModelList.add(deviceDetailsModel);
}
deviceInfoModel.setDeviceDetails(deviceDetailsModelList);
deviceInfoModelList.add(deviceInfoModel);
}
} catch (JSONException e) {
e.printStackTrace();
}
答案 1 :(得分:0)
图像是base64编码的。在服务器上,您需要:
function base64_encode(file) {
var bitmap = fs.readFileSync(file);
return new Buffer(bitmap).toString('base64');
}
然后:
var base64str = base64_encode(filename);
io.emit('getPhoto', base64str);
});
在服务器上完成后,Swift 4客户端代码为:
socket.on("getPhoto") { data,ack in
if let buffer = data[0] as? String {
let decodedData = NSData(base64Encoded: buffer, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)
let img = UIImage(data: decodedData! as Data)
}
}