【发布时间】:2014-01-17 12:06:11
【问题描述】:
我在 as400 和 java 连接方面需要帮助。
我在 SocketTimeoutExceptions 期间收到延迟响应时遇到问题。那么发生的情况是,当我发送第一个请求并发生响应超时时,在发送我的第二个请求后,收到第一个请求的响应,这会产生差异。
有没有办法在超时异常之后,响应不应该缓存或者不应该在下一次请求时被接收?
下面是我连接as400服务器的sn-p代码:
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;
}
【问题讨论】:
-
你有代码要分享吗?
-
你好,请看我的代码
标签: java sockets ibm-midrange