【发布时间】:2012-10-23 14:44:59
【问题描述】:
我有一个关于 HTTPS 套接字如何工作的问题。
我必须在移动设备和服务器之间实现双向通信。
我从蓝牙设备以原始字节的形式获取请求,但请求是以块的形式接收的,它以相同的方式等待响应。我的意思是:设备正在向我发送一个块,我必须将其发送到服务器,并且我必须将服务器响应发送回设备,以接收第二个块。
这一次有效,我的意思是我正在打开套接字,我正在写入请求块,我正在读取响应块,但是当我写入第二个请求块时,没有从套接字接收到数据.
代码如下:
if (webSocket == null) {
SocketFactory factory = SSLSocketFactory.getDefault();
webSocket = factory.createSocket(DataUtils.stringValueFromByteArray(requestPackage.getHostAddress()),
DataUtils.intValueFromByteArray(requestPackage.getHostPort()));
}
webInputStream = webSocket.getInputStream();
webOutputStream = webSocket.getOutputStream();
webOutputStream.write(requestPackage.getDataContent(), 0,requestPackage.getDataContent().length);
webOutputStream.flush();
byte[] byteBuffer = getBytesFromInputStream(webInputStream);
getBytesFromInputStream 的样子:
public static byte[] getBytesFromInputStream(InputStream is)
throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte buf[] = new byte[8192];
int ret = 0;
while ((ret = is.read(buf)) != -1) {
bout.write(buf, 0, ret);
}
byte[] bytes = bout.toByteArray();
return bytes;
}
当请求开始时,webSocket 会得到一个null 值,并且连接不应结束。
现在的问题是这段代码适用于第一个数据块,但在第二个数据块上,getButesFromInputStream 返回一个空数组,因为is.read() 立即返回 -1。
谁能建议我该怎么做,或者向我解释我做错了什么?
任何帮助将不胜感激。 谢谢, 方舟
【问题讨论】:
-
您可能需要稍等片刻才能让数据有时间送达您。也许你可以用一个while循环和一个小的等待来检测-1
-
这取决于你的服务器,大概只有你知道它是如何工作的。此外,如果您确实在使用 HTTPS,请不要使用原始套接字,而应使用
HttpsURLConnection或理解该协议的类似 HTTP 客户端。 -
@njzk2 服务器不是我的,我正在尝试调用任何支持https的页面。
-
@NikolayElenkov 我没有实现服务器,但我请求每个支持 https 的服务器。我将尝试使用 httpsURLConnection 来实现这一点并做出回应。您能否将您的解决方案发布为答案,以便我可以接受它是否有效?谢谢
-
我已经添加了一个答案,但在尝试之前你可能想问他们预期的协议是什么。