Swift socket.io和node socket.io发送二进制文件(图像)

时间:2016-05-19 13:27:55

标签: node.js swift sockets

我正在尝试通过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)

如何从此流中获取图像?

感谢您的帮助

2 个答案:

答案 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)
        }
    }
相关问题