pull/101/head
Louis Royer 4 years ago
parent 65c44569d0
commit 4ba3055289

@ -43,6 +43,9 @@ import tools.HostItem;
import tools.Logger; import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import tools.ServeErrors; import tools.ServeErrors;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.IOException;
/** Class to download file /** Class to download file
* @author Louis Royer * @author Louis Royer
@ -111,6 +114,7 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
writeLog(e, LogLevel.Error); writeLog(e, LogLevel.Error);
} }
} }
writeLog("Downloader stopped", LogLevel.Info);
} }
/** Asks thread to stop /** Asks thread to stop
@ -368,6 +372,7 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
/** Runnable implementation /** Runnable implementation
*/ */
public void run() { public void run() {
writeLog("Downloader started", LogLevel.Info);
try { try {
init(); init();
purgeList(); purgeList();
@ -429,8 +434,11 @@ public abstract class ClientDownload extends ServeErrors implements Runnable {
/** Getter for HostItem socket /** Getter for HostItem socket
* @param hostItem HostItem * @param hostItem HostItem
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/ */
protected abstract Object getHostItemSocket(HostItem hostItem); protected abstract Object getHostItemSocket(HostItem hostItem) throws SocketException, UnknownHostException, IOException;
} }

@ -35,6 +35,9 @@ import clientP2P.ClientDownload;
import tools.HostItem; import tools.HostItem;
import tools.Logger; import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.IOException;
/** Class to download file from tcp /** Class to download file from tcp
* @author Louis Royer * @author Louis Royer
@ -96,8 +99,11 @@ public class ClientDownloadTCP extends ClientDownload {
/** Getter for HostItem socket /** Getter for HostItem socket
* @param hostItem HostItem * @param hostItem HostItem
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/ */
protected Object getHostItemSocket(HostItem hostItem) { protected Object getHostItemSocket(HostItem hostItem) throws SocketException, UnknownHostException, IOException {
return (Object)hostItem.getTCPSocket(); return (Object)hostItem.tryGetTCPSocket();
} }
} }

@ -34,6 +34,9 @@ import clientP2P.ClientDownload;
import tools.HostItem; import tools.HostItem;
import tools.Logger; import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.IOException;
/** Class to download file from udp /** Class to download file from udp
@ -88,10 +91,13 @@ public class ClientDownloadUDP extends ClientDownload {
} }
/** Getter for HostItem socket /** Getter for HostItem socket
* @param hostItem HostItem * @param hostItem HostItemç
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/ */
protected Object getHostItemSocket(HostItem hostItem) { protected Object getHostItemSocket(HostItem hostItem) throws SocketException, UnknownHostException, IOException {
return (Object)hostItem.getUDPSocket(); return (Object)hostItem.tryGetUDPSocket();
} }
/** Close HostItem socket /** Close HostItem socket

@ -35,6 +35,7 @@ import tools.ServeErrors;
import tools.HostItem; import tools.HostItem;
import tools.Logger; import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import java.net.SocketException;
/** Implementation of P2P-JAVA-PROJECT CLIENT /** Implementation of P2P-JAVA-PROJECT CLIENT
* @author Louis Royer * @author Louis Royer
@ -77,8 +78,16 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
} }
/** Getter for tracker socket /** Getter for tracker socket
* @return Tracker's socket
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/
protected abstract Object getTrackerSocket() throws SocketException, UnknownHostException, IOException;
/** Close Tracker socket
*/ */
protected abstract Object getTrackerSocket(); protected abstract void closeTrackerSocket();
/** Initialize hostList from tracker /** Initialize hostList from tracker
@ -88,7 +97,29 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
private void initHostList() throws ProtocolError, InternalError { private void initHostList() throws ProtocolError, InternalError {
ProtocolP2PPacket<?> d = createProtocolP2PPacket(new DiscoverRequest(null)); ProtocolP2PPacket<?> d = createProtocolP2PPacket(new DiscoverRequest(null));
try { try {
d.sendRequest(getTrackerSocket()); boolean contacted = false;
boolean firstLoop = true;
boolean stop = false;
while (!contacted && !stop) {
try {
if (!firstLoop) {
writeLog("Cannot contact tracker. Try again [Y/n] ?", LogLevel.Error);
String tryAgain = scanner.nextLine();
if (tryAgain.equals("n") || tryAgain.equals("N")) {
stop = true;
}
}
firstLoop = false;
d.sendRequest(getTrackerSocket());
contacted = true;
} catch (SocketException e) {
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
if (stop) {
System.exit(3);
}
Payload p = d.receiveResponse().getPayload(); Payload p = d.receiveResponse().getPayload();
assert p instanceof DiscoverResponse : "This payload must be instance of Filelist"; assert p instanceof DiscoverResponse : "This payload must be instance of Filelist";
if (!(p instanceof DiscoverResponse)) { if (!(p instanceof DiscoverResponse)) {
@ -96,6 +127,7 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
} else { } else {
hostList = ((DiscoverResponse)p).getHostList(); hostList = ((DiscoverResponse)p).getHostList();
} }
closeTrackerSocket();
} catch (SocketClosed e){ } catch (SocketClosed e){
writeLog("listDirectory : SocketClosed", LogLevel.Error); writeLog("listDirectory : SocketClosed", LogLevel.Error);
throw new ProtocolError(); throw new ProtocolError();
@ -129,6 +161,12 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
*/ */
protected abstract Object getHostItemSocket(HostItem hostItem); protected abstract Object getHostItemSocket(HostItem hostItem);
/** Close HostItem socket
* @param hostItem HostItem
*/
protected abstract void closeHostItemSocket(HostItem hostItem);
/** list servers directory content /** list servers directory content
* @return list of files * @return list of files
* @throws InternalError * @throws InternalError
@ -148,6 +186,7 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
try { try {
d.sendRequest(getHostItemSocket(hostList.get(0))); d.sendRequest(getHostItemSocket(hostList.get(0)));
Payload p = d.receiveResponse().getPayload(); Payload p = d.receiveResponse().getPayload();
closeHostItemSocket(hostList.get(0));
assert p instanceof FileList : "This payload must be instance of Filelist"; assert p instanceof FileList : "This payload must be instance of Filelist";
if (!(p instanceof FileList)) { if (!(p instanceof FileList)) {
throw new InternalError(); throw new InternalError();
@ -286,5 +325,6 @@ public abstract class ClientManagement extends ServeErrors implements Runnable {
writeLog("File is empty", LogLevel.Error); writeLog("File is empty", LogLevel.Error);
} }
} }
writeLog("Exiting client", LogLevel.Info);
} }
} }

@ -9,6 +9,9 @@ import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import clientP2P.ClientDownloadTCP; import clientP2P.ClientDownloadTCP;
import clientP2P.ClientManagement; import clientP2P.ClientManagement;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.IOException;
/** Implementation of P2P-JAVA-PROJECT CLIENT /** Implementation of P2P-JAVA-PROJECT CLIENT
@ -63,15 +66,34 @@ public class ClientManagementTCP extends ClientManagement {
} }
/** Getter for tracker socket /** Getter for tracker socket
* @return Tracker's socket
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/ */
protected Object getTrackerSocket() { protected Object getTrackerSocket() throws SocketException, UnknownHostException, IOException {
return (Object)tracker.getTCPSocket(); return (Object)tracker.tryGetTCPSocket();
} }
/** Close Tracker socket
*/
protected void closeTrackerSocket() {
tracker.closeTCPSocket();
}
/** Getter for HostItem socket /** Getter for HostItem socket
* @param hostItem HostItem * @param hostItem HostItem
*/ */
protected Object getHostItemSocket(HostItem hostItem) { protected Object getHostItemSocket(HostItem hostItem) {
return (Object)hostItem.getTCPSocket(); return (Object)hostItem.getTCPSocket();
} }
/** Close HostItem socket
* @param hostItem HostItem
*/
protected void closeHostItemSocket(HostItem hostItem) {
hostItem.closeTCPSocket();
}
} }

@ -9,6 +9,9 @@ import tools.Logger;
import tools.LogLevel; import tools.LogLevel;
import clientP2P.ClientDownloadUDP; import clientP2P.ClientDownloadUDP;
import clientP2P.ClientManagement; import clientP2P.ClientManagement;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.IOException;
/** Implementation of P2P-JAVA-PROJECT CLIENT /** Implementation of P2P-JAVA-PROJECT CLIENT
* @author Louis Royer * @author Louis Royer
@ -60,9 +63,19 @@ public class ClientManagementUDP extends ClientManagement {
} }
/** Getter for tracker socket /** Getter for tracker socket
* @return Tracker's socket
* @throws SocketException
* @throws UnknownHostException
* @throws IOException
*/ */
protected Object getTrackerSocket() { protected Object getTrackerSocket() throws SocketException, UnknownHostException, IOException {
return (Object)tracker.getUDPSocket(); return (Object)tracker.tryGetUDPSocket();
}
/** Close Tracker socket
*/
protected void closeTrackerSocket() {
tracker.closeUDPSocket();
} }
/** Getter for HostItem socket /** Getter for HostItem socket

@ -88,6 +88,7 @@ public abstract class FileWatcher implements Runnable {
setStop(); setStop();
} }
} }
writeLog("File watcher end of loop", LogLevel.Debug);
} }
/** Register server on tracker /** Register server on tracker

@ -52,7 +52,7 @@ public class FileWatcherUDP extends FileWatcher {
try { try {
writeLog("Trying to register into tracker", LogLevel.Info); writeLog("Trying to register into tracker", LogLevel.Info);
ProtocolP2PPacket<Register> p = (ProtocolP2PPacket<Register>)new ProtocolP2PPacketUDP<Register>(new Register(server)); ProtocolP2PPacket<Register> p = (ProtocolP2PPacket<Register>)new ProtocolP2PPacketUDP<Register>(new Register(server));
p.sendRequest((Object)tracker.getUDPSocket()); p.sendRequest((Object)tracker.tryGetUDPSocket());
writeLog("Register request sent (but cannot ensure reception).", LogLevel.Debug); writeLog("Register request sent (but cannot ensure reception).", LogLevel.Debug);
tracker.closeUDPSocket(); tracker.closeUDPSocket();
} catch (Exception e) { } catch (Exception e) {

@ -60,6 +60,7 @@ public abstract class RatioWatcher implements Runnable {
setStop(); setStop();
} }
} }
writeLog("Ratio watcher end of loop", LogLevel.Debug);
} }
/** Invalidate the cache by cleaning all hashmaps /** Invalidate the cache by cleaning all hashmaps

@ -68,6 +68,7 @@ public abstract class ServerManagement extends ServeErrors implements Runnable {
ratioWatcher.setStop(); ratioWatcher.setStop();
sendUnregisterRequest(); sendUnregisterRequest();
closeSocket(); closeSocket();
writeLog("Server stopped", LogLevel.Info);
} }
/** Closes socket */ /** Closes socket */

@ -95,6 +95,7 @@ public class ServerManagementTCP extends ServerManagement {
writeLog("Socket has been closed", LogLevel.Info); writeLog("Socket has been closed", LogLevel.Info);
} }
} }
writeLog("Server end of loop", LogLevel.Debug);
} }
/** Private runnable class allowing to serve one client. /** Private runnable class allowing to serve one client.
@ -162,6 +163,7 @@ public class ServerManagementTCP extends ServerManagement {
} }
/** Getter for tracker socket /** Getter for tracker socket
* @return Tracker's socket
*/ */
protected Object getTrackerSocket() { protected Object getTrackerSocket() {
return (Object)tracker.getTCPSocket(); return (Object)tracker.getTCPSocket();

@ -89,6 +89,7 @@ public class ServerManagementUDP extends ServerManagement {
} catch (LocalException e) { } catch (LocalException e) {
} }
} }
writeLog("Server end of loop", LogLevel.Debug);
} }
@ -116,6 +117,7 @@ public class ServerManagementUDP extends ServerManagement {
} }
/** Getter for tracker socket /** Getter for tracker socket
* @return Tracker's socket
*/ */
protected Object getTrackerSocket() { protected Object getTrackerSocket() {
return (Object)tracker.getUDPSocket(); return (Object)tracker.getUDPSocket();

@ -32,21 +32,19 @@ public class HostItem {
* @return TCP Socket * @return TCP Socket
*/ */
public Socket getTCPSocket() { public Socket getTCPSocket() {
if (tcpSocket == null || tcpSocket.isClosed()) { try {
try { return tryGetTCPSocket();
tcpSocket = new Socket(InetAddress.getByName(hostname), port); } catch (SocketException e) {
} catch (SocketException e) { System.err.println("getTCPSocket error: No TCP socket available.");
System.err.println("getTCPSocket error: No TCP socket available."); System.exit(-1);
System.exit(-1); } catch (UnknownHostException e) {
} catch (UnknownHostException e) { System.err.println("getTCPSocket error: Unknown host (" + this + ").");
System.err.println("getTCPSocket error: Unknown host (" + this + ")."); System.exit(-1);
System.exit(-1); } catch (IOException e) {
} catch (IOException e) { System.err.println("getTCPSocket error: Cannot create TCP socket (" + this + ").");
System.err.println("getTCPSocket error: Cannot create TCP socket (" + this + ")."); System.exit(-1);
System.exit(-1);
}
} }
return tcpSocket; return null; // java compiler is stupid and doesn't know about System.exit
} }
/** Get TCP Socket. /** Get TCP Socket.
@ -79,17 +77,27 @@ public class HostItem {
* return UDP Socket * return UDP Socket
*/ */
public DatagramSocket getUDPSocket() { public DatagramSocket getUDPSocket() {
try {
return tryGetUDPSocket();
} catch (SocketException e) {
System.err.println("getUDPSocket error: No UDP socket available." );
System.exit(-1);
} catch (UnknownHostException e) {
System.err.println("getUDPSocket error: Unknown host (" + this + ").");
System.exit(-1);
}
return null; // java compiler is stupid and doesn't know about System.exit
}
/** Get UDP Socket.
* @return UDP Socket
* @throws SocketException
* @throws UnknownHostException
*/
public DatagramSocket tryGetUDPSocket() throws SocketException, UnknownHostException {
if (udpSocket == null || udpSocket.isClosed()) { if (udpSocket == null || udpSocket.isClosed()) {
try { udpSocket = new DatagramSocket();
udpSocket = new DatagramSocket(); udpSocket.connect(InetAddress.getByName(hostname), port);
udpSocket.connect(InetAddress.getByName(hostname), port);
} catch (SocketException e) {
System.err.println("getUDPSocket error: No UDP socket available." );
System.exit(-1);
} catch (UnknownHostException e) {
System.err.println("getUDPSocket error: Unknown host (" + this + ").");
System.exit(-1);
}
} }
return udpSocket; return udpSocket;
} }

Loading…
Cancel
Save