java - 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)
?谢谢。
解决方案
正如您所指出的,这些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()
.
但是你也需要小心一点。如果您已经用BufferedOutputStream
、Writer
堆栈或类似的东西包装了套接字的输出流,那么潜入并将一个字节写入底层流可能会搞砸事情。您的“心跳”消息(如果是这样的话)可能会随机出现在其他消息的中间。
推荐阅读
- excel - 在 Windows 10 中更改系统日期
- python - 按具有多种类型数据的列剪切数据框并将其分组pandas python
- python - 具有自定义第一行的组中的行之间的差异
- google-cloud-platform - GCP Cloud Build 为每个 Cloud Function 部署发布单个事件
- c - 计算您的起床时间并打印出来的程序
- .net - 公共类中.Net Core 3.1中的会话变量
- sql-server - 为什么我收到 Microsoft SQL:Power BI 上的语法错误?
- vba - 循环遍历字符串数组
- python - Python 请求抓取图像以“data:image/”格式返回 src
- powershell - 如何通过为其运行powershell脚本为批处理文件中的变量赋值?