Fix #57
This commit is contained in:
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();
|
protected abstract Object getTrackerSocket() throws SocketException, UnknownHostException, IOException;
|
||||||
|
|
||||||
|
/** Close Tracker socket
|
||||||
|
*/
|
||||||
|
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 server’s directory content
|
/** list server’s 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…
Reference in New Issue
Block a user