【问题标题】:How does SSLSocket send heart connection like Socket.sendUrgentData()SSLSocket如何像Socket.sendUrgentData()一样发送心脏连接
【发布时间】:2019-05-15 16:12:32
【问题描述】:

我使用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的?
  • @Spara 由 CA、客户端、服务器密钥库。我在我的问题中添加了方法。

标签: java sockets ssl


【解决方案1】:

如您所述,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)的建议

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

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

【讨论】:

  • flush(),好的。也许我必须实现自己的“心跳”。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多