gpt4 book ai didi

java - 应用引擎 : Keep Socket Open more than 2 Minutes

转载 作者:搜寻专家 更新时间:2023-11-01 03:40:35 24 4
gpt4 key购买 nike

使用 App Engine Trusted Tester Sockets 连接到 APNS。写入套接字工作正常。

但问题是 Socket 在闲置 2 分钟后会被回收。它在 Trusted Tester Website 中表示,任何套接字操作都会使套接字保持 Activity 状态 2 分钟。最好在 APNS 决定关闭连接之前保持套接字打开。

在尝试几乎所有 Socket API 方法后,除了写入输出流之外,Socket 无论如何都会在 2 分钟后关闭。我错过了什么?

部署在java后端。

最佳答案

你不能人为地打开连接到 APNS 的套接字;而不发送实际的推送通知。保持打开状态的唯一方法是发送一些任意数据/字节,但这会导致套接字立即关闭;一旦检测到不符合协议(protocol)的内容,即不是实际推送通知的内容,APNS 会立即关闭连接。

SO_KEEPALIVE

SO_KEEPALIVE 怎么样? App Engine 明确表示它受支持。我认为这只是意味着当您调用 Socket.setKeepAlive(true) 时它不会抛出异常;想要设置套接字选项的调用之前引发了 Not Implemented 异常。即使您启用了 keep-alive,如果您没有发送超过 2 分钟的内容,您的套接字也会被回收(关闭);至少目前在 App Engine 上是这样。

其实,也没什么大惊小怪的。 RFC1122指定 TCP Keep Alive 明确声明 TCP Keep Alives 不会每两小时发送一次以上,然后,只有在没有其他流量时才需要。虽然,它还说这个间隔也必须是可配置的,但是 java.net.Socket 上没有 API 可以用来配置它(很可能是因为它高度依赖操作系统),我怀疑它会不会在 App Engine 上设置为 2 分钟。

SO_TIMEOUT

SO_TIMEOUT 呢?这是完全不同的东西。 Socket.setSoTimeout() 的 javadoc 指出:

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite timeout.

也就是说,当 read() 因为没有什么可读的东西而被阻塞太久时,你可以说“好的,我不想再等待(阻塞)了;让我们做点别的事情吧”。这对我们的“2 分钟”问题没有帮助。

然后呢?

解决此问题的唯一方法是:检测连接何时被回收/关闭,然后将其丢弃并打开一个新连接。并且有一个库完全支持这一点。

查看 java-apns-gae

它是一个开源 Java APNS 库,专门设计用于在 Google App Engine 上运行(并被使用)。

https://github.com/ZsoltSafrany/java-apns-gae

关于java - 应用引擎 : Keep Socket Open more than 2 Minutes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com