我使用Socket.sendUrgentData()使连接保持活动状态。但是为了安全起见,现在我尝试将其更改为SSLSocket。 SSLSocket不会例外地继承此方法:

SSLSocket not supproted this method.


有没有比实现我们的own sendUrgentData()更好的方法了,这意味着实现发送心脏连接的方法。

我的代码是这样的:

public void checkConnection(SSLSocket sslSocket) {
    if(sslSocket == null){
        return;
    }
    try{
        //socket.sendUrgentData(0xFF);
        sslSocket.getOutputStream.write(0xFF);
    } catch (IOException e){
        e.printStackTrace();
        return;
    }
}
public SSLSocket init(){
    /**
     * ip,port,KeyManagerFactory, TrustManagerFactory
     */
    return (SSLSocket)context.getSocketFactory().createSocket(host, port);
}


或有关优化sslSocket.getOutputStream.write(0xFF)的一些建议?谢谢。

最佳答案

如您所述,SSLSocket实现不支持sendUrgentData。这是来自sun.security.ssl.BaseSSLSocketImpl的源代码:

/**
 * Send one byte of urgent data on the socket.
 * @see java.net.Socket#sendUrgentData
 * At this point, there seems to be no specific requirement to support
 * this for an SSLSocket. An implementation can be provided if a need
 * arises in future.
 */
@Override
public final void sendUrgentData(int data) throws SocketException {
    throw new SocketException("This method is not supported "
                    + "by SSLSockets");
}


然后您问:


  或有关优化sslSocket.getOutputStream.write(0xFF)的一些建议


假设您的意思是“加速”而不是“优化”,则应在flush()之后在流上调用write()

但是您还需要对此小心一点。如果用BufferedOutputStreamWriter堆栈或类似的东西包装了套接字的输出流,那么深入研究并向底层流写入一个字节可能会使事情搞砸。您的“心跳”消息(如果是这样的话)可能会随机出现在其他消息的中间。

关于java - SSLSocket如何发送像Socket.sendUrgentData()这样的心脏连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53778891/

10-09 09:01