有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Websocket在对同一socket发出下一个请求之前等待响应

public WebSocket connect() throws Exception {
WebSocket ws = new WebSocketFactory().setConnectionTimeout(TIMEOUT).createSocket(SERVER)
.addListener(new WebSocketAdapter() {
public void onTextMessage(WebSocket websocket, String message) {
System.out.println(message);
}

public void onConnected(WebSocket websocket, java.util.Map headers) {
System.out.println(websocket.getSocket().toString());
System.out.println(headers.toString());
logger.logInfo("QlikWebConnector", "connect", "connection: ",
websocket.getSocket().toString() + headers.toString());
}

public void onMessageError(com.neovisionaries.ws.client.WebSocket websocket,
com.neovisionaries.ws.client.WebSocketException cause, java.util.List frames)
throws java.lang.Exception {
}

public void onSendError(com.neovisionaries.ws.client.WebSocket websocket,
com.neovisionaries.ws.client.WebSocketException cause,
com.neovisionaries.ws.client.WebSocketFrame frame) throws java.lang.Exception {
}

public void onBinaryMessage(com.neovisionaries.ws.client.WebSocket websocket, byte[] binary)
throws java.lang.Exception {
}

public void onDisconnected(com.neovisionaries.ws.client.WebSocket websocket,
com.neovisionaries.ws.client.WebSocketFrame serverCloseFrame,
com.neovisionaries.ws.client.WebSocketFrame clientCloseFrame, boolean closedByServer)
throws java.lang.Exception {
}
}).addExtension(WebSocketExtension.PERMESSAGE_DEFLATE).connect();
if (ws.isOpen()) {
System.out.println("websocket is open ");
logger.logInfo("QlikWebConnector", "connect", "websocket is open: ", "websocket is open");
}
return ws;
}

我发送的请求如下:- 1) ws。sendText(“我的消息”)2)ws。sendText(“我的消息2”)

发生了什么事? 1) 两个请求同时被触发

问题/预期:- 1) 我希望socket等待第一个请求得到处理,因为第二个请求取决于第一个请求的响应

有线索吗


共 (1) 个答案

  1. # 1 楼答案

    一种方法是稍微改变一下程序的逻辑。例如,您可以发送第一条消息并监听响应,而不是同时从同一地点发送两条消息。收到第一条消息的回复后,您可以发送第二条消息

    比如:

    public void onTextMessage(WebSocket websocket, String message) {
        if (shouldSendSeccondMessage(message)) {
            sendSeccondMessage();
        }
    }
    

    如果您有一些状态,并且根据您发送的特定消息的状态,那么您可以考虑使用State pattern。因此,对于每条消息,您的状态机将决定下一步(消息)