80 řádky
1,8 KiB
Java
80 řádky
1,8 KiB
Java
package fr.insa.clavardator.network;
|
|
|
|
import fr.insa.clavardator.util.ErrorCallback;
|
|
|
|
import java.io.IOException;
|
|
import java.net.ServerSocket;
|
|
import java.net.Socket;
|
|
|
|
import static fr.insa.clavardator.network.PeerConnection.TCP_PORT;
|
|
|
|
public class ConnectionListener {
|
|
Acceptor acceptor = null;
|
|
|
|
public ConnectionListener() {
|
|
}
|
|
|
|
/**
|
|
* Start accepting incoming connections
|
|
*
|
|
* @param callback The function to call when a user connects
|
|
* @param errorCallback The function to call on errror
|
|
*/
|
|
public void acceptConnection(NewConnectionCallback callback, ErrorCallback errorCallback) {
|
|
if (acceptor != null) {
|
|
acceptor.stopAccepting();
|
|
}
|
|
acceptor = new Acceptor(callback, errorCallback);
|
|
acceptor.start();
|
|
}
|
|
|
|
/**
|
|
* Stop accepting incoming connexions.
|
|
* Must be called before exiting the app.
|
|
*/
|
|
public void stopAccepting() {
|
|
if (acceptor != null)
|
|
acceptor.stopAccepting();
|
|
}
|
|
|
|
|
|
private static class Acceptor extends Thread {
|
|
private boolean shouldStop = false;
|
|
private final NewConnectionCallback callback;
|
|
private final ErrorCallback errorCallback;
|
|
private ServerSocket server;
|
|
|
|
public Acceptor(NewConnectionCallback callback, ErrorCallback errorCallback) {
|
|
this.callback = callback;
|
|
this.errorCallback = errorCallback;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
server = new ServerSocket(TCP_PORT);
|
|
while (!shouldStop) {
|
|
Socket clientSocket = server.accept();
|
|
callback.onNewConnection(clientSocket);
|
|
}
|
|
} catch (IOException e) {
|
|
if (!shouldStop)
|
|
errorCallback.onError(e);
|
|
}
|
|
|
|
}
|
|
|
|
public void stopAccepting() {
|
|
shouldStop = true;
|
|
try {
|
|
server.close();
|
|
} catch (IOException ignored) {
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public interface NewConnectionCallback {
|
|
void onNewConnection(Socket clientSocket);
|
|
}
|
|
}
|