Fix user not being disconnected on local network

This commit is contained in:
Yohan Simard 2021-01-27 12:19:30 +01:00
parent 298e01d09c
commit 599a4a1121
5 changed files with 18 additions and 36 deletions

View file

@ -2,11 +2,9 @@ package fr.insa.clavardator.client.users;
import fr.insa.clavardator.lib.network.TcpConnection; import fr.insa.clavardator.lib.network.TcpConnection;
import fr.insa.clavardator.lib.util.ErrorCallback; import fr.insa.clavardator.lib.util.ErrorCallback;
import fr.insa.clavardator.lib.util.Log;
import fr.insa.clavardator.lib.util.SimpleCallback; import fr.insa.clavardator.lib.util.SimpleCallback;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.EOFException;
import java.io.Serializable; import java.io.Serializable;
public class DirectPeerConnection extends PeerConnection { public class DirectPeerConnection extends PeerConnection {
@ -18,35 +16,21 @@ public class DirectPeerConnection extends PeerConnection {
} }
@Override @Override
protected void send(Serializable message, SimpleCallback callback, @Nullable ErrorCallback errorCallback) { protected void send(Serializable message, @Nullable SimpleCallback callback, @Nullable ErrorCallback errorCallback) {
connection.send(message, callback, errorCallback); connection.send(message, callback, errorCallback);
} }
@Override @Override
protected void receive(TcpConnection.MessageReceivedCallback callback, ErrorCallback errorCallback) { protected void receive(TcpConnection.MessageReceivedCallback callback, ErrorCallback errorCallback) {
connection.receive(callback, connection.receive(callback, errorCallback);
e -> {
disconnect();
if (!(e instanceof EOFException)) {
Log.e(this.getClass().getSimpleName(), "Error receiving message from " + user.getId(), e);
errorCallback.onError(e);
}
});
} }
/** @Override
* Close the connection to this user public void disconnect() {
*/
private void closeConnection() {
if (connection != null && connection.isOpen()) { if (connection != null && connection.isOpen()) {
connection.close(); connection.close();
} }
} }
@Override
public void disconnect() {
closeConnection();
}
} }

View file

@ -14,7 +14,7 @@ public abstract class PeerConnection {
this.user = user; this.user = user;
} }
protected abstract void send(Serializable message, SimpleCallback calback, @Nullable ErrorCallback errorCallback); protected abstract void send(Serializable message, @Nullable SimpleCallback calback, @Nullable ErrorCallback errorCallback);
/** /**
* Subscribe to this user messages. * Subscribe to this user messages.

View file

@ -15,6 +15,7 @@ import fr.insa.clavardator.lib.util.Log;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.EOFException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
@ -38,7 +39,13 @@ public class PeerUser extends User implements Comparable<PeerUser> {
setId(id); setId(id);
setUsername(username); setUsername(username);
setState(UserState.CONNECTED); setState(UserState.CONNECTED);
connection.receive(msg -> onMessageReceived(msg, errorCallback), errorCallback); connection.receive(msg -> onMessageReceived(msg, errorCallback), e -> {
disconnect();
if (!(e instanceof EOFException)) {
Log.e(this.getClass().getSimpleName(), "Error receiving message from " + getId(), e);
errorCallback.onError(e);
}
});
} }
public void init(TcpConnection tcpConnection, String id, String username, ErrorCallback errorCallback) { public void init(TcpConnection tcpConnection, String id, String username, ErrorCallback errorCallback) {
@ -116,7 +123,7 @@ public class PeerUser extends User implements Comparable<PeerUser> {
Log.v(this.getClass().getSimpleName(), "Received username request using current username"); Log.v(this.getClass().getSimpleName(), "Received username request using current username");
UsernameTakenException exception = new UsernameTakenException("Username taken", UsernameTakenException exception = new UsernameTakenException("Username taken",
CurrentUser.getInstance().getId(), getId()); CurrentUser.getInstance().getId(), getId());
connection.send(exception, connection::disconnect, null); connection.send(exception, null, null);
} else { } else {
Log.e(this.getClass().getSimpleName(), "Could not send UsernameTaken: connection is not initialized"); Log.e(this.getClass().getSimpleName(), "Could not send UsernameTaken: connection is not initialized");
} }

View file

@ -3,11 +3,9 @@ package fr.insa.clavardator.client.users;
import fr.insa.clavardator.client.server.Proxy; import fr.insa.clavardator.client.server.Proxy;
import fr.insa.clavardator.lib.network.TcpConnection; import fr.insa.clavardator.lib.network.TcpConnection;
import fr.insa.clavardator.lib.util.ErrorCallback; import fr.insa.clavardator.lib.util.ErrorCallback;
import fr.insa.clavardator.lib.util.Log;
import fr.insa.clavardator.lib.util.SimpleCallback; import fr.insa.clavardator.lib.util.SimpleCallback;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.EOFException;
import java.io.Serializable; import java.io.Serializable;
public class ProxyPeerConnection extends PeerConnection { public class ProxyPeerConnection extends PeerConnection {
@ -19,21 +17,14 @@ public class ProxyPeerConnection extends PeerConnection {
} }
@Override @Override
protected void send(Serializable message, SimpleCallback callback, @Nullable ErrorCallback errorCallback) { protected void send(Serializable message, @Nullable SimpleCallback callback, @Nullable ErrorCallback errorCallback) {
proxy.send(message, callback, errorCallback); proxy.send(message, callback, errorCallback);
} }
@Override @Override
protected void receive(TcpConnection.MessageReceivedCallback callback, ErrorCallback errorCallback) { protected void receive(TcpConnection.MessageReceivedCallback callback, ErrorCallback errorCallback) {
proxy.receive(user.getId(), callback, proxy.receive(user.getId(), callback, errorCallback);
e -> {
disconnect();
if (!(e instanceof EOFException)) {
Log.e(this.getClass().getSimpleName(), "Error receiving message from " + user.getId(), e);
errorCallback.onError(e);
}
});
} }
@Override @Override

View file

@ -88,9 +88,9 @@ public class TcpConnection {
outputStream.close(); outputStream.close();
if (inputStream != null) if (inputStream != null)
inputStream.close(); inputStream.close();
if (socket != null)
socket.close(); socket.close();
} catch (IOException ignored) { } catch (IOException ignored) {
} }
} }