📄 blockingclienthandler.java
字号:
/*
* This file is part of the QuickServer library
* Copyright (C) QuickServer.org
*
* Use, modification, copying and distribution of this software is subject to
* the terms and conditions of the GNU Lesser General Public License.
* You should have received a copy of the GNU LGP License along with this
* library; if not, you can download a copy from <http://www.quickserver.org/>.
*
* For questions, suggestions, bug-reports, enhancement-requests etc.
* visit http://www.quickserver.org
*
*/
package org.quickserver.net.server.impl;
import org.quickserver.net.server.*;
import org.quickserver.net.*;
import org.quickserver.util.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
import java.nio.channels.*;
public class BlockingClientHandler extends BasicClientHandler {
private static final Logger logger = Logger.getLogger(BlockingClientHandler.class.getName());
public BlockingClientHandler(int instanceCount) {
super(instanceCount);
}
public BlockingClientHandler() {
super();
}
public void clean() {
logger.finest("Starting clean - "+getName());
super.clean();
logger.finest("Finished clean - "+getName());
}
protected void finalize() throws Throwable {
clean();
super.finalize();
}
public void handleClient(TheClient theClient) {
super.handleClient(theClient);
}
protected void setInputStream(InputStream in) throws IOException {
this.in = in;
if(getDataMode(DataType.IN) == DataMode.STRING) {
b_in = null;
o_in = null;
bufferedReader = new BufferedReader(new InputStreamReader(this.in));
} else if(getDataMode(DataType.IN) == DataMode.OBJECT) {
b_in = null;
bufferedReader = null;
o_in = new ObjectInputStream(in);
} else if(getDataMode(DataType.IN) == DataMode.BYTE ||
getDataMode(DataType.IN) == DataMode.BINARY) {
o_in = null;
bufferedReader = null;
b_in = new BufferedInputStream(in);
}
}
public BufferedReader getBufferedReader() {
return bufferedReader;
}
public synchronized void closeConnection() {
if(connection==false) return;
connection = false;
try {
if(hasEvent(ClientEvent.MAX_CON_BLOCKING)==false) {
notifyCloseOrLost();
}
if(out!=null) {
logger.finest("Closing output streams");
try {
out.flush();
} catch(IOException ioe) {
logger.finest("Flushing output streams failed: "+ioe);
}
if(socket!=null && isSecure()==false) {
socket.shutdownOutput();
}
if(dataModeOUT == DataMode.OBJECT) {
o_out.close();
} else {
b_out.close();
}
if(out!=null) out.close();
}
if(in!=null) {
logger.finest("Closing input streams");
//if(socket!=null) socket.shutdownInput();
if(dataModeIN == DataMode.STRING) {
if(bufferedReader!=null) bufferedReader.close();
} else if(dataModeIN == DataMode.OBJECT) {
o_in.close();
} else {
b_in.close();
}
if(in!=null) in.close();
}
} catch(IOException e) {
logger.warning("Error in closeConnection : "+e);
if(logger.isLoggable(Level.FINE)) {
logger.fine("StackTrace:\n"+MyString.getStackTrace(e));
}
} catch(NullPointerException npe) {
logger.fine("NullPointerException: "+npe);
if(logger.isLoggable(Level.FINE)) {
logger.fine("StackTrace:\n"+MyString.getStackTrace(npe));
}
}
}
public void run() {
if(unprocessedClientEvents.size()==0) {
logger.finest("No unprocessed ClientEvents!");
return;
}
ClientEvent currentEvent = (ClientEvent) unprocessedClientEvents.remove(0);
if(logger.isLoggable(Level.FINEST)) {
StringBuffer sb = new StringBuffer();
sb.append("Running ").append(getName());
sb.append(" using ");
sb.append(Thread.currentThread().getName());
sb.append(" for ");
synchronized(clientEvents) {
if(clientEvents.size()>1) {
sb.append(currentEvent+", Current Events - "+clientEvents);
} else {
sb.append(currentEvent);
}
}
logger.finest(sb.toString());
}
if(currentEvent==null) {
threadEvent.set(null);
return;
} else {
threadEvent.set(currentEvent);
}
try {
if(socket==null)
throw new SocketException("Socket was null!");
prepareForRun();
if(getThreadEvent()==ClientEvent.MAX_CON_BLOCKING) {
processMaxConnection(currentEvent);
}
try {
if(getThreadEvent()==ClientEvent.RUN_BLOCKING) {
clientEventHandler.gotConnected(this);
if(authorised == false) {
if(clientAuthenticationHandler==null && authenticator == null) {
authorised = true;
} else {
if(clientAuthenticationHandler!=null) {
AuthStatus authStatus = null;
do {
authStatus = processAuthorisation();
} while(authStatus==AuthStatus.FAILURE);
if(authStatus==AuthStatus.SUCCESS)
authorised = true;
} else {
processAuthorisation();
}
}
}//end of authorised
processRead();
}
} catch(SocketException e) {
appLogger.finest("SocketException - Client [" +
getHostAddress() +"]: " + e.getMessage());
//e.printStackTrace();
lost = true;
} catch(AppException e) {
//errors from Application
appLogger.finest("AppException "+Thread.currentThread().getName()+": "
+ e.getMessage());
} catch(javax.net.ssl.SSLException e) {
lost = true;
if(Assertion.isEnabled()) {
appLogger.info("SSLException - Client ["+getHostAddress()
+"] "+Thread.currentThread().getName()+": " + e);
} else {
appLogger.warning("SSLException - Client ["+
getHostAddress()+"]: "+e);
}
} catch(ConnectionLostException e) {
lost = true;
if(e.getMessage()!=null)
appLogger.finest("Connection lost " +
Thread.currentThread().getName()+": " + e.getMessage());
else
appLogger.finest("Connection lost "+Thread.currentThread().getName());
} catch(IOException e) {
lost = true;
appLogger.fine("IOError "+Thread.currentThread().getName()+": " + e);
} catch(AssertionError er) {
logger.warning("[AssertionError] "+getName()+" "+er);
if(logger.isLoggable(Level.FINEST)) {
logger.finest("StackTrace "+Thread.currentThread().getName()+": "+MyString.getStackTrace(er));
}
assertionSystemExit();
} catch(Error er) {
logger.warning("[Error] "+er);
if(logger.isLoggable(Level.FINEST)) {
logger.finest("StackTrace "+Thread.currentThread().getName()+": "+MyString.getStackTrace(er));
}
if(Assertion.isEnabled()) {
assertionSystemExit();
}
lost = true;
} catch(RuntimeException re) {
logger.warning("[RuntimeException] "+MyString.getStackTrace(re));
if(Assertion.isEnabled()) {
assertionSystemExit();
}
lost = true;
}
if(getThreadEvent()!=ClientEvent.MAX_CON_BLOCKING) {
notifyCloseOrLost();
}
if(connection) {
logger.finest(Thread.currentThread().getName()+" calling closeConnection()");
closeConnection();
}
} catch(javax.net.ssl.SSLException se) {
logger.warning("SSLException "+Thread.currentThread().getName()+" - " + se);
} catch(IOException ie) {
logger.warning("IOError "+Thread.currentThread().getName()+" - Closing Client : " + ie);
} catch(RuntimeException re) {
logger.warning("[RuntimeException] "+getName()+" "+Thread.currentThread().getName()+" - "+MyString.getStackTrace(re));
if(Assertion.isEnabled()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -