我正在使用SSL连接来连接服务器(我无法控制并且无法访问它的代码,可能是它的错,但我想确定),当我发送数据时(一个字节数组) )我第一次得到正确的响应,但在后续发送中,我得到了前一次发送所期望的响应。例如,假设我发送x,我希望服务器回复x,y到y,z到z等...
当应用程序启动时,我调用x,然后获取x。但后来我打电话给y并得到x,调用z得到y,调用x并得到z等等...... 这是为每个发送和接收命令实现的通用代码(字节是用一组预定的字节启动来模拟,比如命令x)
byte[] bytes = new byte[6];
if(socket == null || !socket.isConnected() || socket.isClosed())
try {
getSocket(localIp);
} catch (IOException e1) {
e1.printStackTrace();
}
if (socket == null || !socket.isConnected()) {
try {
getSocket(globalIp);
} catch (IOException e1) {
e1.printStackTrace();
return null;
}
}
byte[] recievedBytes = null;
String sentBString = "sendGetConfig: ";
for (int i = 0; i < bytes.length; i++) {
sentBString += String.valueOf(bytes[i]) + ", ";
}
System.out.println(sentBString);
if (socket != null){
try {
DataOutputStream os = new DataOutputStream(socket.getOutputStream());
os.write(bytes);
DataInputStream is = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
int tries = 0;
while (tries < 20 && (recievedBytes == null || recievedBytes.length == 0)) {
if (is.markSupported()) {
is.mark(2048);
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
try {
nRead = is.read(data, 0, data.length);
buffer.write(data, 0, nRead);
} catch (Exception e) {
}
buffer.flush();
recievedBytes = buffer.toByteArray();
if (recievedBytes.length == 0)
is.reset();
}
is.close();
os.close();
socket.close();
}
}
我知道读取的实现并不完美,它是我所做的解决方法的结果,因为服务器不发送任何流结束指示,因此在循环中实现的任何读取命令都会导致超时异常
任何帮助将不胜感激
答案 0 :(得分:1)
服务器不发送任何流结束指示
当然服务器发送EOS指示。问题是你完全无视它。当对等体关闭连接并且没有更多待处理数据被读取时,read()
返回-1。
所以在循环中实现的任何读取命令都会导致超时异常
无意义。
循环的正确形式如下:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
根据需要替换您自己的变量名称。
您继续阅读相同数据的原因是因为您将流重置为同一点。只需抛弃mark()
和reset()
来电即可。