我有一个Java TLS客户端,它可以向服务器发送一系列请求,每个请求后面都有对服务器的响应。
但是,有许多不同的服务器。有些是“多消息”服务器,在第一个请求后保持连接打开,以便可以通过第一个连接发送后续请求。另一些是“单消息”服务器,在每条消息之后关闭连接,因此后续消息需要新的连接。客户端没有先验的方法来知道它正在与什么类型的服务器通信,也无法修复服务器。
非常希望单个消息服务能够在没有完全握手的情况下恢复会话。
我最初的客户端代码只是尝试通过同一连接发送后续请求。如果失败,它只是打开了与服务器的新连接。因此,它可以处理单消息和多消息服务器。
然而,将第二条消息发送到单个消息服务器时的失败似乎会终止会话恢复。
我的棘手工作是注意消息是否失败,然后假设它正在与单个消息服务器通信,在这种情况下,客户端在收到每个响应后显式关闭套接字。这使后续连接能够恢复会话。
但是必须有更好的方法。毫不奇怪,测试isInputShutdown或isConnted没有帮助,因为存在时间问题。单消息服务器的连接失败实际上发生在读取响应期间,在写入请求之后,可能是由于缓冲。
有什么好主意吗?
在纯文本的情况下,您的初始解决方案是正确的:当发送第二条消息时,您将得到一个IOException:connection reset by peer,您可以通过重新连接进行相应的恢复。
然而,在TLS的情况下,它将不起作用,因为您将不会得到IOException:connection reset by peer,而是一个由致命的TLS意外消息引起的SocketException。RFC 2246#7.2规定:
致命级别的警报消息会立即终止连接。在这种情况下,与会话相对应的其他连接可以继续,但会话标识符必须无效,以防止失败的会话用于建立新连接。
[我的重点是],因为失败的会话现在被认为是不安全的,并且
意外的消息
收到不合适的消息。此警报始终是致命的,在正确实现之间的通信中不应观察到。
你的第二个解决方案对我来说似乎很合适。
注意:
isInputShutdown()
永远不会为真,因为您不能在SSLSocket上调用Shutdown Input()
。isConnted()
一旦连接了套接字,就永远不会是false。问题内容: 我最近开始在应用程序中使用hibernate和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣
我有一个有状态的会话bean,我在那里发送和接收JMS消息。所有的连接设置都是手动处理的,因此bean包含javax.jms.connection和javax.jms.Session的实例。该bean还实现了MessageListener,使其能够接收消息。 注意:这是在Java EE环境(GlassFish4.0)中执行的 编辑:
我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)
我读过很多帖子,人们说在java、语句等中关闭连接,但我没有找到我的问题的答案。 我问我不做Con.close(),但我做所以它会关闭连接或不? 所以我只想知道,当我们关闭结果集时,连接是否会关闭?
问题内容: 一个只有一个数据库的hibernate会话将保持多少个连接? 问题答案: 在给定的时间,给定的会话将仅保留一个连接,您可以使用connect()方法进行访问。 使用reconnect()方法可以更改所使用的连接。
问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家