Java SSL连接返回上一个回复

时间:2014-06-23 07:48:07

标签: java android datainputstream dataoutputstream

我正在使用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();
    }
}

我知道读取的实现并不完美,它是我所做的解决方法的结果,因为服务器不发送任何流结束指示,因此在循环中实现的任何读取命令都会导致超时异常

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

  

服务器不发送任何流结束指示

当然服务器发送EOS指示。问题是你完全无视它。当对等体关闭连接并且没有更多待处理数据被读取时,read()返回-1。

  

所以在循环中实现的任何读取命令都会导致超时异常

无意义。

循环的正确形式如下:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

根据需要替换您自己的变量名称。

您继续阅读相同数据的原因是因为您将流重置为同一点。只需抛弃mark()reset()来电即可。