我已经设置了AWS WebSocket API并创建了Lambda方法(Python 3.9):onConnect、onSendMessage和onDisconnect。然后我创建了一个与服务器通信的java应用程序。我正在使用OKHTTP客户端。
我设置了一个pingInterval来保持连接。在最后的应用程序中,这将是300秒,但为了加快测试速度,我将其设置为10秒。一切都很完美。我可以连接、发送消息、断开连接,所有这些都可以在CloudWatch中跟踪。但是,当我使用此方法连接,然后关闭设备中的互联网连接时,会调用onFailure,并显示消息:“错误:发送了ping,但在10000ms内没有收到pong(在1次成功ping/pong之后)”。问题是AWS WebSocket API不调用onDisconnect方法,并且我在CloudWatch中找不到任何发生了失败的ping/pong活动的迹象。如何使AWS WebSocket API知道连接已关闭(以这样的方式,我可以获取连接ID并对其进行处理)?
OkHttpClient client; WebSocket ws; private void start_web_socket() { client = new OkHttpClient.Builder() .pingInterval(10, TimeUnit.SECONDS) .build(); String url = "wss://myweb_socket_address"; Request request = new Request.Builder() .url(url) .build(); WebSocketEcho listener = new WebSocketEcho(); ws = client.newWebSocket(request, listener); client.dispatcher().executorService().shutdown(); } public class WebSocketEcho extends WebSocketListener { private static final int NORMAL_CLOSURE_STATUS = 1000; @Override public void onOpen(WebSocket webSocket, Response response) { System.out.println("Connection open : " + response.toString()); } @Override public void onMessage(WebSocket webSocket, String text) { System.out.println("Receiving : " + text); } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { System.out.println("Receiving bytes : " + bytes.hex()); } @Override public void onClosing(WebSocket webSocket, int code, String reason) { webSocket.close(NORMAL_CLOSURE_STATUS, null); System.out.println("Closing : " + code + " / " + reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { System.out.println("Error : " + t.getMessage()); } }