我有具有工作ssl(TLS)连接的android客户端和C ++服务器。但是对于每条消息,我必须打开新的ssl会话,依此类推。
我可以通过一个SSL套接字发送多个消息吗?怎么样?
我尝试过重用我的单消息工作代码,如下所示。

BufferedWriter w = new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream()));
w.write(request, 0, request.length());
w.flush(); // this works (server got data)

BufferedReader r = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
StringBuilder response = new StringBuilder();
String actRecieved = null;
while ((actRecieved = r.readLine()) != null) {
    response.append(actRecieved);
}
Log.d("TEST", "one: " + response.toString()); // this works (server send data, I read it)

request = "some special request 2";
w.write(request, 0, request.length());
w.flush(); // this does not work, no data went to server, but no error occured

actRecieved = null;
response = new StringBuilder();
while ((actRecieved = r.readLine()) != null) {
    response.append(actRecieved);
}
Log.d("TEST", "two: " + response.toString()); // this does not work as well, because server is not send any data


那么,问题出在哪里呢?谁能告诉我?

更新资料

我刚刚发现,当我不从流中读取数据时,有2个写入请求将到达服务器。

使用来自一个套接字的输入和输出流的多重时间是否有任何问题?
我应该使用两个套接字吗?一个用于读取,另一个用于写入?

帮助任何人。

最佳答案

好的,最后我自己找到了解决方案。
问题在于读取,因为r.readLine()在服务器关闭连接之前一直处于阻塞状态,因此在此之后什么也不能发送。

现在客户端不再等待服务器关闭连接,而是检查消息是否完整。
像这样:

while ((actRecieved = r.readLine()) != null) {
     response.append(actRecieved);
     if(actRecieved.endsWith("SomeEndMark")
         break;
}


希望这对其他人有帮助。

10-07 19:09
查看更多