Skip to content

Commit 4661c19

Browse files
GodFuperBrutus5000
authored andcommitted
Adding a Reconnect button to manually restore the connection
1 parent 2dc1eed commit 4661c19

5 files changed

Lines changed: 79 additions & 18 deletions

File tree

ice-adapter/src/main/java/com/faforever/iceadapter/IceAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public static void onHostGame(String mapName) {
9292
public static void onJoinGame(String remotePlayerLogin, int remotePlayerId) {
9393
log.info("onJoinGame {} {}", remotePlayerId, remotePlayerLogin);
9494
createGameSession();
95-
int port = gameSession.connectToPeer(remotePlayerLogin, remotePlayerId, false);
95+
int port = gameSession.connectToPeer(remotePlayerLogin, remotePlayerId, false, 0);
9696

9797
GPGNetServer.clientFuture.thenAccept(gpgNetClient -> {
9898
gpgNetClient.getLobbyFuture().thenRun(() -> {
@@ -108,7 +108,7 @@ public static void onConnectToPeer(String remotePlayerLogin, int remotePlayerId,
108108
}
109109

110110
log.info("onConnectToPeer {} {}, offer: {}", remotePlayerId, remotePlayerLogin, String.valueOf(offer));
111-
int port = gameSession.connectToPeer(remotePlayerLogin, remotePlayerId, offer);
111+
int port = gameSession.connectToPeer(remotePlayerLogin, remotePlayerId, offer, 0);
112112

113113
GPGNetServer.clientFuture.thenAccept(gpgNetClient -> {
114114
gpgNetClient.getLobbyFuture().thenRun(() -> {

ice-adapter/src/main/java/com/faforever/iceadapter/debug/DebugWindowController.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package com.faforever.iceadapter.debug;
22

3+
import com.faforever.iceadapter.IceAdapter;
34
import javafx.event.ActionEvent;
45
import javafx.fxml.FXML;
56
import javafx.scene.control.*;
67
import javafx.scene.control.cell.PropertyValueFactory;
78
import javafx.scene.layout.HBox;
9+
import javafx.util.Callback;
810
import lombok.extern.slf4j.Slf4j;
911
import org.slf4j.LoggerFactory;
1012

13+
import java.util.Objects;
14+
1115

1216
@Slf4j
1317
public class DebugWindowController {
@@ -33,6 +37,7 @@ public class DebugWindowController {
3337
public TableColumn loginColumn;
3438
public TableColumn offerColumn;
3539
public TableColumn connectedColumn;
40+
public TableColumn buttonReconnect;
3641
public TableColumn stateColumn;
3742
public TableColumn rttColumn;
3843
public TableColumn lastColumn;
@@ -51,6 +56,12 @@ public void onKillAdapterClicked(ActionEvent actionEvent) {
5156
System.exit(337);
5257
}
5358

59+
public void reconnectToPeer(DebugWindow.DebugPeer peer) {
60+
if (Objects.nonNull(peer)) {
61+
new Thread(() -> IceAdapter.gameSession.reconnectToPeer(peer.getId())).start();
62+
}
63+
}
64+
5465
@FXML
5566
private void initialize() {
5667
if(Debug.ENABLE_DEBUG_WINDOW_LOG_TEXT_AREA) {
@@ -71,6 +82,30 @@ private void initialize() {
7182
localCandColumn.setCellValueFactory(new PropertyValueFactory<>("localCandidate"));
7283
remoteCandColumn.setCellValueFactory(new PropertyValueFactory<>("remoteCandidate"));
7384

85+
buttonReconnect.setCellFactory(new Callback<TableColumn, TableCell>() {
86+
@Override
87+
public TableCell<DebugWindow.DebugPeer, DebugWindow.DebugPeer> call(TableColumn param) {
88+
return new TableCell<>() {
89+
final Button btn = new Button("reconnect");
90+
91+
@Override
92+
protected void updateItem(DebugWindow.DebugPeer item, boolean empty) {
93+
super.updateItem(item, empty);
94+
setText(null);
95+
if (empty) {
96+
setGraphic(null);
97+
} else {
98+
btn.setOnAction(event -> {
99+
DebugWindow.DebugPeer peer = getTableRow().getItem();
100+
reconnectToPeer(peer);
101+
});
102+
setGraphic(btn);
103+
}
104+
}
105+
};
106+
}
107+
});
108+
74109
killAdapterButton.setOnAction(this::onKillAdapterClicked);
75110
}
76111
}

ice-adapter/src/main/java/com/faforever/iceadapter/ice/GameSession.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public GameSession() {
5252
*
5353
* @return the port the ice adapter will be listening/sending for FA
5454
*/
55-
public int connectToPeer(String remotePlayerLogin, int remotePlayerId, boolean offer) {
56-
Peer peer = new Peer(this, remotePlayerId, remotePlayerLogin, offer);
55+
public int connectToPeer(String remotePlayerLogin, int remotePlayerId, boolean offer, int preferredPort) {
56+
Peer peer = new Peer(this, remotePlayerId, remotePlayerLogin, offer, preferredPort);
5757
peers.put(remotePlayerId, peer);
5858
debug().connectToPeer(remotePlayerId, remotePlayerLogin, offer);
5959
return peer.getFaSocket().getLocalPort();
@@ -72,6 +72,23 @@ public void disconnectFromPeer(int remotePlayerId) {
7272
//TODO: still attempting to ICE
7373
}
7474

75+
/**
76+
* Does a manual {@link #disconnectFromPeer} and {@link #connectToPeer}.
77+
* Uses the same port that was on the previous connection.
78+
*/
79+
public void reconnectToPeer(Integer remotePlayerId) {
80+
Peer reconnectPeer = peers.get(remotePlayerId);
81+
if (Objects.nonNull(reconnectPeer)) {
82+
String remotePlayerLogin = reconnectPeer.getRemoteLogin();
83+
boolean offer = reconnectPeer.isLocalOffer();
84+
int port = reconnectPeer.getFaSocket()
85+
.getLocalPort();
86+
87+
disconnectFromPeer(remotePlayerId);
88+
connectToPeer(remotePlayerLogin, remotePlayerId, offer, port);
89+
}
90+
}
91+
7592
/**
7693
* Stops the connection to all peers and all ice agents
7794
*/

ice-adapter/src/main/java/com/faforever/iceadapter/ice/Peer.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@ public class Peer {
1919
private final int remoteId;
2020
private final String remoteLogin;
2121
private final boolean localOffer;//Do we offer or are we waiting for a remote offer
22+
private final int preferredPort;
2223

23-
private PeerIceModule ice = new PeerIceModule(this);
24+
public volatile boolean closing = false;
25+
26+
private final PeerIceModule ice = new PeerIceModule(this);
2427
private DatagramSocket faSocket;//Socket on which we are listening for FA / sending data to FA
2528

26-
public Peer(GameSession gameSession, int remoteId, String remoteLogin, boolean localOffer) {
29+
public Peer(GameSession gameSession, int remoteId, String remoteLogin, boolean localOffer, int preferredPort) {
2730
this.gameSession = gameSession;
2831
this.remoteId = remoteId;
2932
this.remoteLogin = remoteLogin;
3033
this.localOffer = localOffer;
34+
this.preferredPort = preferredPort;
3135

32-
log.debug("Peer created: {}, {}, localOffer: {}", remoteId, remoteLogin, String.valueOf(localOffer));
36+
log.debug("Peer created: {}, localOffer: {}, preferredPort: {}", getPeerIdentifier(), String.valueOf(localOffer), preferredPort);
3337

34-
initForwarding();
38+
initForwarding(preferredPort);
3539

3640
if (localOffer) {
3741
new Thread(ice::initiateIce).start();
@@ -41,9 +45,9 @@ public Peer(GameSession gameSession, int remoteId, String remoteLogin, boolean l
4145
/**
4246
* Starts waiting for data from FA
4347
*/
44-
private void initForwarding() {
48+
private void initForwarding(int port) {
4549
try {
46-
faSocket = new DatagramSocket(0);
50+
faSocket = new DatagramSocket(port);
4751
} catch (SocketException e) {
4852
log.error("Could not create socket for peer: {}", getPeerIdentifier(), e);
4953
}
@@ -65,8 +69,11 @@ synchronized void onIceDataReceived(byte data[], int offset, int length) {
6569
faSocket.send(packet);
6670
} catch (UnknownHostException e) {
6771
} catch (IOException e) {
68-
log.error("Error while writing to local FA as peer (probably disconnecting from peer) " + getPeerIdentifier(), e);
69-
return;
72+
if (closing) {
73+
log.debug("Ignoring error the send packet because the connection was closed {}", getPeerIdentifier());
74+
} else {
75+
log.error("Error while writing to local FA as peer (probably disconnecting from peer) {}", getPeerIdentifier(), e);
76+
}
7077
}
7178
}
7279

@@ -81,29 +88,30 @@ private void faListener() {
8188
faSocket.receive(packet);
8289
ice.onFaDataReceived(data, packet.getLength());
8390
} catch (IOException e) {
84-
log.debug("Error while reading from local FA as peer (probably disconnecting from peer) " + getPeerIdentifier(), e);
91+
if (closing) {
92+
log.debug("Ignoring error the receive packet because the connection was closed as peer {}", getPeerIdentifier());
93+
} else {
94+
log.debug("Error while reading from local FA as peer (probably disconnecting from peer) {}", getPeerIdentifier(), e);
95+
}
8596
return;
8697
}
8798
}
8899
log.debug("No longer listening for messages from FA");
89100
}
90101

91-
public volatile boolean closing = false;
92102
public void close() {
93103
if(closing) {
94104
return;
95105
}
96106

97-
log.info("Closing peer for player {}", getRemoteId());
107+
log.info("Closing peer for player {}", getPeerIdentifier());
98108

99109
closing = true;
100110
if(faSocket != null) {
101111
faSocket.close();
102112
}
103113

104-
if(ice != null) {
105-
ice.close();
106-
}
114+
ice.close();
107115
}
108116

109117
/**

ice-adapter/src/main/resources/debugWindow.fxml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<TableColumn fx:id="idColumn" prefWidth="40.0" text="id" />
5757
<TableColumn fx:id="loginColumn" prefWidth="150.0" text="login" />
5858
<TableColumn fx:id="connectedColumn" prefWidth="90.0" text="connected" />
59+
<TableColumn fx:id="buttonReconnect" prefWidth="90.0" text="reconnect"/>
5960
<TableColumn fx:id="localCandColumn" prefWidth="70.0" text="local" />
6061
<TableColumn fx:id="remoteCandColumn" prefWidth="70.0" text="remote" />
6162
<TableColumn fx:id="stateColumn" prefWidth="100.0" text="state" />

0 commit comments

Comments
 (0)