首页 > 解决方案 > SSLSocket如何像Socket.sendUrgentData()一样发送心脏连接

问题描述

我曾经Socket.sendUrgentData()保持连接活跃。但为了安全起见,现在我尝试将其更改为 SSLSocket。SSLSocket 不继承此方法,但有异常:

SSLSocket not supproted this method.

有没有比实现 our 更好的方法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)?谢谢。

标签: javasocketsssl

解决方案


正如您所指出的,这些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堆栈或类似的东西包装了套接字的输出流,那么潜入并将一个字节写入底层流可能会搞砸事情。您的“心跳”消息(如果是这样的话)可能会随机出现在其他消息的中间。


推荐阅读