Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java套接字中接收到延迟响应_Java_Sockets_Ibm Midrange - Fatal编程技术网

java套接字中接收到延迟响应

java套接字中接收到延迟响应,java,sockets,ibm-midrange,Java,Sockets,Ibm Midrange,我需要as400和java连接方面的帮助 在SocketTimeOutException期间,我遇到了接收延迟响应的问题。因此,当我发送第一个请求时,响应超时发生,在发送第二个请求后,第一个请求的响应被接收,这造成了差异 是否有一种方法,在超时异常之后,响应不应缓存或在下一个请求时不应接收 下面是连接到as400服务器的代码片段: public synchronized static byte[] sendRequestAndGetResponse(byte[] requestBytes) {

我需要as400和java连接方面的帮助

在SocketTimeOutException期间,我遇到了接收延迟响应的问题。因此,当我发送第一个请求时,响应超时发生,在发送第二个请求后,第一个请求的响应被接收,这造成了差异

是否有一种方法,在超时异常之后,响应不应缓存或在下一个请求时不应接收

下面是连接到as400服务器的代码片段:

public synchronized static byte[] sendRequestAndGetResponse(byte[] requestBytes) {
    try {
        if(checkHostConnection()){
            LOG.debug("Sending request bytes to Host: {}", Hexifier.toHex(requestBytes));
            IOUtils.write(requestBytes, dos);
            long startTime = System.currentTimeMillis();
            LOG.info("Request sent to host.");

            LOG.info("Waiting on host response");
            byte[] responseLengthBuffer = new byte[4];
            IOUtils.readFully(dis, responseLengthBuffer);

            ByteBuffer bb = ByteBuffer.wrap(responseLengthBuffer);
            int msgLength = bb.getInt();

            byte[] responseRemBytes = new byte[msgLength];
            IOUtils.readFully(dis, responseRemBytes);
            long endTime = System.currentTimeMillis();

            byte[] fullResponseBytes = new byte[responseLengthBuffer.length + responseRemBytes.length];

            System.arraycopy(responseLengthBuffer, 0, fullResponseBytes, 0, responseLengthBuffer.length);
            System.arraycopy(responseRemBytes, 0, fullResponseBytes, responseLengthBuffer.length, responseRemBytes.length);
            LOG.debug("Response from server is received. Time elapsed at {} millis.", (endTime - startTime));
            LOG.debug("Bytes received: {}", Hexifier.toHex(fullResponseBytes));

            return fullResponseBytes;

        } else {
            reconnectToHost();
        }

    } catch (SocketTimeoutException  ste){
        LOG.error("Reading response from socket timeout: {}", ste.getClass().getName());

        try {
            LOG.warn("Waiting for Host reply from its socket timeout.");
            socket.shutdownInput();
            socket.shutdownOutput();

            int hostResponsefromTimeout = dis.read();
            if (hostResponsefromTimeout == -1){
                LOG.debug("Host has responded with -1");

            } else {
                LOG.debug("Host responded with: {}", hostResponsefromTimeout);
            }

        } catch (Exception e){
            LOG.error("Error encountered while trying to validate if Host responded with last timeout.");
           LOG.error(e.getMessage(), e);

        }


        reconnectToHost();

    } catch (EOFException eofe) {
        LOG.debug("An error occurred while reading stream from Host socket connection: {}", eofe.getClass().getName());
        LOG.error(eofe.getMessage(), eofe);

        if (eofe.getMessage() != null && eofe.getMessage().contains("actual: 0")){
            LOG.warn("No bytes were found at stream. Host did not respond.");
        }

        reconnectToHost();

    } catch (SocketException e) {
        LOG.error("An error occurred while attempting to connect to Host: {}", e.getClass().getName());
        LOG.error(e.getMessage(), e);

        if (e.getMessage().contains("Broken pipe")){
            LOG.debug("Connection to Host was lost.");
        }

        reconnectToHost();

    } catch (Exception e) {
        LOG.error(e.getMessage(), e);
        LOG.debug("An error occurred while attempting to connect to Host: {}", e.getClass().getName());
        reconnectToHost();
    }

    return null;
}

如果您在一个套接字上获得了一个
SocketTimeoutException
,否则您计划重新用于另一个请求,请关闭它,不要将其重新用于另一个请求。摆脱所有关闭,读取catch处理程序中的代码,然后关闭套接字。这样,您就不可能在同一套接字上获得后续请求的“错误响应”


如果你有很多超时,你的超时时间太短了。通常,它应该是相关请求的预期服务时间的两倍。

您有一些代码要共享吗?您好,请参阅我的代码您好,在SocketTimeoutException关闭套接字并为另一个请求创建一个新的套接字之后,方法reconnectToHost()。这是我的初始实现,但是仍然会遇到延迟响应。我添加了关机功能和读取代码,以确保正常断开与主机的连接:[link]()