/** listen: start to listen if there is any clients connected */ public void listen() { // Firstly spawn a new thread and then the main thread // also start listening _userNet = new DropboxFileServerUserNet(_server, _userOut, _userIn, _userSock); _userNet.start(); /* Use main thread, cannot be stopped */ while (_sock != null && !_sock.isClosed()) { try { String line = NetComm.receive(_in); _dlog(line); parse(line); } catch (Exception e) { if (!_server.noException()) { _elog(e.toString()); } break; // Break the loop } } /* Clear */ // Close main thread clear(); // Cancel the listening thread and retry _server.cancelListeningThread(); /* Also cancel all of the syncers */ _server.cancelSyncers(); // Retry after try { _log( "The connection to master is broken," + " reset everything and retry connection after " + DropboxConstants.TRY_CONNECT_MILLIS + " milliseconds"); Thread.sleep(DropboxConstants.TRY_CONNECT_MILLIS); } catch (InterruptedException e) { if (!_server.noException()) { _elog(e.toString()); } if (_server.debugMode()) { e.printStackTrace(); } } _server.run(); clear(); _log(_threadName + " is stopped"); }
/** * close: close the socket and stream * * @return: true for success, false for error */ protected boolean close() { _dlog("Do main thread closing..."); if (_sock != null && !_sock.isClosed()) { _dlog("Closing the receiving thread"); try { _sock.close(); _in.close(); _out.close(); _sock = null; _in = null; _out = null; _dlog("Success!"); } catch (IOException e) { if (!_server.noException()) { _elog(e.toString()); } if (_server.debugMode()) { e.printStackTrace(); } return false; } } _sock = null; _in = null; _out = null; _dlog("Cancel the user input thread"); if (_userNet != null) { _userNet.stop(); _userNet.join(); // guaranteed to be closed _userNet = null; } if (_userSock != null && !_userSock.isClosed()) { _dlog("Closing the user input thread"); // Stop the user thread try { _userSock.close(); _userIn.close(); _userOut.close(); _userSock = null; _userIn = null; _userOut = null; _dlog("Success!"); } catch (IOException e) { if (!_server.noException()) { _elog(e.toString()); } if (_server.debugMode()) { e.printStackTrace(); } return false; } } _userSock = null; _userIn = null; _userOut = null; /* Cancel all client nodes */ _dlog("Finished"); return true; /* CAUTION: _server is never cleared */ }