-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDoDServerController.java
129 lines (108 loc) · 4.14 KB
/
DoDServerController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.io.IOException;
import java.util.*;
public class DoDServerController {
private boolean serverRunning;
private GameLogic game;
private DoDServerGUI serverGUI;
private DoDServerClientListener currentActiveClientListener;
private HashMap<Integer, DoDServerClientListener> clientListenerHashMap;
public DoDServerController() {
init();
}
private int getCurrentActivePort() {
return currentActiveClientListener.getPortNumber();
}
private void init() {
clientListenerHashMap = new HashMap<>();
serverRunning = false;
game = new GameLogic(this);
}
public void startGame() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DoDServerStartGUI(DoDServerController.this).createAndShowGUI();
}
});
}
private void updateCurrentClientListener(DoDServerClientListener clientListener) {
if (currentActiveClientListener != null)
currentActiveClientListener.stopAcceptingClients();
currentActiveClientListener = clientListener;
currentActiveClientListener.startAcceptingClients();
}
private boolean portUsed(int portNumber) {
return clientListenerHashMap.containsKey(portNumber);
}
private void setupNewClientListener(DoDServerClientListener newClientListener) {
updateCurrentClientListener(newClientListener);
clientListenerHashMap.put(getCurrentActivePort(), newClientListener);
new Thread(newClientListener).start();
}
public String attemptServerStart(String portString) {
if (isValidPort(portString)) {
int portNumber = Integer.parseInt(portString);
if (portUsed(portNumber)) {
if (portNumber == getCurrentActivePort()) {
return "Port already active";
} else {
updateCurrentClientListener(clientListenerHashMap.get(portNumber));
return null;
}
} else {
try {
DoDServerClientListener newClientListener = new DoDServerClientListener(game, portNumber);
newClientListener.startServerSocket();
setupNewClientListener(newClientListener);
if (!serverRunning) {
startMainGui();
serverRunning = true;
} else {
serverGUI.updatePortLabel(portString);
}
return null;
} catch (IOException e) {
return "Cannot start server";
}
}
} else {
return "Invalid port";
}
}
private void startMainGui() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
serverGUI = new DoDServerGUI(DoDServerController.this, game, getCurrentActivePort());
serverGUI.createAndShowGUI();
}
});
}
private boolean isValidPort(String portNumber) {
if (portNumber == null) {
return false;
} else if (
portNumber.equals("") ||
!portNumber.matches("^[0-9]{1,6}+$") ||
Integer.parseInt(portNumber) > 65536
) {
return false;
}
return true;
}
public void updateMapGrid() {
serverGUI.updateMapGrid();
}
public void endGame() {
game.endGame();
currentActiveClientListener.stopServerSocket();
Collection<DoDServerClientListener> list = clientListenerHashMap.values();
Iterator<DoDServerClientListener> iterator = list.iterator();
while (iterator.hasNext()) {
DoDServerClientListener clientListener = iterator.next();
clientListener.stopServerSocket();
}
init();
startGame();
}
}