📄 waveclient.java
字号:
Channel chan = null;
try {
chan = new Channel(net, sta, chn);
}
catch (IllegalArgumentException ex) {
System.err.println("WaveClient.getTimes(): " + ex.getMessage());
ex.fillInStackTrace();
throw ex;
}
List timeWindowList = new ArrayList();
int retVal = this.getTimes(chan, timeWindowList);
if (retVal < TN_SUCCESS) return retVal;
Iterator iter = timeWindowList.iterator();
while (iter.hasNext()) {
TimeWindow timeWindow = (TimeWindow) iter.next();
timeRangeList.add(timeWindow.getTimeRange());
}
return retVal;
}
/** Requests the sample rate for the seismic channel specified by the input string parameters.
* Returns the sample rate data returned in the server response.
* Returns Double.NaN if no data was available.
* @exception java.lang.IllegalArgumentException Valid Channel cannot be constructed from the input parameters.
* @exception WaveClientException error occurred recovering sample rate data
*/
public double getSampleRate (String net, String sta, String chn ) throws WaveClientException {
Channel chan = null;
try {
chan = new Channel(net, sta, chn);
}
catch (IllegalArgumentException ex) {
System.err.println("WaveClient.getSampleRate(): " + ex.getMessage());
ex.fillInStackTrace();
throw ex;
}
int status = getSampleRate(chan);
if (status < TN_SUCCESS) {
if (status == TN_NODATA) return Double.NaN;
else throw new WaveClientException("WaveClient.getSampleRate() returned error code: " + getStatusMessage(status));
}
return chan.sampleRate;
}
/** Closes the connection object's socket and attempts to re-establish new socket connection with the same host and port.
* Returns true upon success, false otherwise.
*/
private static boolean reconnect(TCPConn conn) {
System.err.println("Attempting WaveClient.reconnect() to " + conn.socket.toString());
boolean retVal = true;
try {
//done by reset: conn.close();
conn.reset();
}
catch (IOException ex) {
System.err.println("Error WaveClient.reconnect() io error reconnecting to " + conn.socket.toString());
System.err.println(ex.getMessage());
ex.printStackTrace();
retVal = false;
}
catch (Exception ex) {
System.err.println("Error WaveClient.reconnect() caught exception reconnecting to " + conn.socket.toString());
System.err.println(ex.getMessage());
ex.printStackTrace();
retVal = false;
}
System.err.println("Reconnect successful");
return retVal;
}
/** Attempts to sends the input TCPMessage to the server host described by the TCPConn socket.
* Returns true if successful, false otherwise.
*/
private static boolean sendRequest(TCPConnClient conn, TCPMessage requestMessage) {
return conn.send(requestMessage);
}
/** Returns a TCPMessage from the server host described by the TCPConn socket.
* If no response if completed by the specified timeout interval the request is aborted.
* Returns null if unsuccessful.
*/
private static TCPMessage receiveResponse(TCPConnClient conn, int timeoutMilliSecs) {
TCPMessage responseMessage = null;
try {
responseMessage = conn.receive(timeoutMilliSecs);
}
catch (TCPConnException ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.err.println("Error WaveClient.receiveResponse() caught exception ");
ex.printStackTrace();
}
return responseMessage;
}
/** Requests data from the server host described by the input TCPConn via a requesting TCPMessage.
* If no response if completed by the set number of connection retries the request is aborted.
* Returns the server generated response TCPMessage, or null if unsuccessful.
*/
private TCPMessage requestReply(TCPConnClient conn, TCPMessage requestMessage) {
TCPMessage responseMessage = null;
for (int retry = 0; retry <= maxRetries; retry++) {
if (sendRequest(conn, requestMessage)) {
responseMessage = receiveResponse(conn, maxTimeout);
if (responseMessage == null) {
System.err.println( "Error WaveClient.requestReply() invalid response message" );
}
else break; // success
}
else System.err.println("Error WaveClient.requestReply() Unable to send request message to server");
// reset connection
if (maxRetries > 0) {
if (reconnect(conn)) continue; // retry again with a new request/response iteration
System.err.println("Error WaveClient.requestReply() reconnection attempt: " + String.valueOf(retry) + " failed");
break; // failure can't reconnect;
}
}
return responseMessage;
}
/** Returns the TCMessage constructed from the specified input values.
* @exception WaveClientException message construction failed.
*/
private static TCPMessage prepareMessage(int messageType, int requestSequenceNumber, TrinetSerial [] fields)
throws WaveClientException {
TCPMessage requestMessage = null;
try {
if (fields == null)
throw new NullPointerException("WaveClient.prepareMessage(...) null fields [] input parameter.");
int fieldsLength = fields.length;
// Construct the get data request message, prepare the request parameters
requestMessage = new TCPMessage(messageType, fieldsLength);
requestMessage.appendField(requestSequenceNumber);
for (int index = 0; index < fieldsLength; index++) {
requestMessage.appendField(fields[index].toByteArray());
}
}
catch (Exception ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
throw new WaveClientException("Error WaveClient.prepareMessage() caught exception creating request message fields");
}
return requestMessage;
}
/** Returns the reference to the input responseMessage TCPMessage reference.
* @exception WaveClientException input parameter response message is null.
* @exceptionWaveClientIdException response sequence number does not match the request sequence number.
* @exception java.io.IOException response message sequence number cannot be parsed.
*/
private static TCPMessage verifyResponseMessage(TCPMessage responseMessage, int requestSequenceNumber)
throws IOException, WaveClientException {
if (responseMessage == null) throw new WaveClientException("WaveClient.verifyResponseMessage() null message");
// Verify the message sequence number
// must set the message iterator
int responseSequenceNumber = responseMessage.nextFieldValueAsInt();
if (responseSequenceNumber != requestSequenceNumber)
throw new WaveClientIdException("Error WaveClient.verifyResponseMessage() response id does not match request id: "
+ responseSequenceNumber + " != " + requestSequenceNumber);
return responseMessage;
}
/** Generates a request message, requests a server reply, then checks the server reponse for validity.
* Returns the response message.
* @exception WaveClientException error processing message.
* @exception java.io.IOException connection error or error parsing serialized data stream.
*/
private TCPMessage processMessage(TCPConnClient conn, int requestMessageType, TrinetSerial [] fields)
throws IOException, WaveClientException {
// Create a new message identifier
int requestSequenceNumber = sequenceNumberCounter.plus();
// Create a request message type
TCPMessage requestMessage = prepareMessage(requestMessageType, requestSequenceNumber, fields);
// Submit the request, check for response
TCPMessage responseMessage = requestReply(conn, requestMessage);
// Check validity of message, if no exception thrown, return response message data
return verifyResponseMessage(responseMessage, requestSequenceNumber);
}
/** Processes a "getData" request message type.
* Returns TN_SUCCESS if the server response provided data, else returns an error code.
*/
private int doGetData(TCPConnClient conn, Channel chan, TimeWindow requestedTimeWindow, Collection dataSegmentList) {
// Prepare the request parameters
TrinetSerial [] fields = new TrinetSerial[2];
fields[0] = chan;
fields[1] = requestedTimeWindow;
int retVal = TN_FAILURE;
try {
// Check validity of message and get its content: either error code or data
TCPMessage responseMessage = processMessage(conn, TN_TCP_GETDATA_REQ, fields);
switch (responseMessage.getMessageType()) {
case TN_TCP_ERROR_RESP:
retVal = responseMessage.nextFieldValueAsInt();
if (retVal == TN_FAILURE) retVal = TN_NODATA; // TEMPORARY PATCH UNTIL DWS CODES FIXED
break;
case TN_TCP_GETDATA_RESP:
chan.sampleRate = responseMessage.nextFieldValueAsDouble ();
int numberOfSegments = responseMessage.nextFieldValueAsInt();
for (; numberOfSegments > 0; numberOfSegments--) {
dataSegmentList.add(new DataSegment(responseMessage.nextFieldValueAsBytes()));
}
retVal = TN_SUCCESS;
break;
default:
System.err.println("Error WaveClient.doGetData() Unrecognized response message");
}
}
catch (WaveClientException ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (IOException ex) {
System.err.println("Error WaveClient.doGetData() Failure parsing response message");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.err.println("Error WaveClient.doGetData() caught exception.");
ex.printStackTrace();
}
return retVal;
}
/** Processes a "getSampleRate" request message type.
* Returns TN_SUCCESS if the server response provided data, else returns an error code.
*/
private int doGetSampleRate(TCPConnClient conn, Channel chan) {
// Prepare the request parameters
TrinetSerial [] fields = new TrinetSerial[1];
fields[0] = chan;
int retVal = TN_FAILURE;
try {
// Check validity of message and get its content: either error code or data
TCPMessage responseMessage = processMessage(conn, TN_TCP_GETRATE_REQ, fields);
switch (responseMessage.getMessageType()) {
case TN_TCP_ERROR_RESP:
retVal = responseMessage.nextFieldValueAsInt();
if (retVal == TN_FAILURE) retVal = TN_NODATA; // TEMPORARY PATCH UNTIL DWS CODES FIXED
break;
case TN_TCP_GETRATE_RESP:
chan.sampleRate = responseMessage.nextFieldValueAsDouble ();
retVal = TN_SUCCESS;
break;
default:
System.err.println("Error WaveClient.doGetSampleRate() Unrecognized response message");
}
}
catch (WaveClientException ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (IOException ex) {
System.err.println("Error WaveClient.doGetSampleRate() Failure parsing response message");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
catch (Exception ex) {
System.err.println("Error WaveClient.doGetSampleRate() caught exception.");
ex.printStackTrace();
}
return retVal;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -