Fix: major changes to TCP server/client stack.
This commit is contained in:
@@ -8,11 +8,10 @@ import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer;
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
public class TCPClient implements Serializable{
|
||||
Socket communicationSocket = null;
|
||||
public class TCPClient {
|
||||
Socket communicationSocket;
|
||||
ObjectInputStream socketReceive;
|
||||
ObjectOutputStream socketSend;
|
||||
|
||||
GameController controller;
|
||||
String hostname;
|
||||
int port;
|
||||
@@ -23,43 +22,44 @@ public class TCPClient implements Serializable{
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public boolean start(String user, int players){
|
||||
public boolean start(String user, int proposedNPlayers){
|
||||
try{
|
||||
communicationSocket = new Socket(hostname, port);
|
||||
socketSend = new ObjectOutputStream(communicationSocket.getOutputStream());
|
||||
socketReceive = new ObjectInputStream(communicationSocket.getInputStream());
|
||||
|
||||
socketSend.writeObject(new AddPlayer(user, players));
|
||||
sendEvent(new AddPlayer(user, proposedNPlayers));
|
||||
if(communicationSocket.getInputStream().read() == -1){
|
||||
System.out.println("Could not connect to server");
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
Thread listener = new Thread(() -> ReceiveMessage());
|
||||
Thread listener = new Thread(() -> receiveMessage());
|
||||
listener.start();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch(Exception e){
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void ReceiveMessage(){
|
||||
private void receiveMessage(){
|
||||
while(true){
|
||||
try{
|
||||
Object read = socketReceive.readObject();
|
||||
|
||||
if (read instanceof NetworkEvent) { //TODO non fare con instanceof
|
||||
NetworkEvent event = (NetworkEvent) read;
|
||||
if (read instanceof NetworkEvent event) { //TODO non fare con instanceof
|
||||
if(event.getIsError()) {
|
||||
System.out.println(event.toString());
|
||||
System.out.println(event);
|
||||
} else {
|
||||
event.apply(controller);
|
||||
//clientController.view.update(); TODO
|
||||
}
|
||||
}
|
||||
else if (read instanceof Game) {
|
||||
controller.setModel((Game) read);
|
||||
else if (read instanceof Game model) {
|
||||
controller.setModel(model);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -69,11 +69,10 @@ public class TCPClient implements Serializable{
|
||||
catch(ClassNotFoundException e){
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void SendEvent(NetworkEvent event){
|
||||
private void sendEvent(NetworkEvent event){
|
||||
try{
|
||||
socketSend.writeObject(event);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package it.polimi.ingsw.gc14.Network.TCP.Server;
|
||||
|
||||
import it.polimi.ingsw.gc14.Controller.GameController;
|
||||
import it.polimi.ingsw.gc14.Model.Game;
|
||||
import it.polimi.ingsw.gc14.Network.NetworkEvent;
|
||||
import it.polimi.ingsw.gc14.Network.EventType;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
@@ -12,12 +10,10 @@ import java.util.concurrent.BlockingQueue;
|
||||
|
||||
public class ClientHandler implements Runnable {
|
||||
private Socket clientSocket;
|
||||
private TCPServer server;
|
||||
public ObjectInputStream in = null;
|
||||
public ObjectOutputStream out = null;
|
||||
public ObjectInputStream in;
|
||||
public ObjectOutputStream out;
|
||||
List<ClientHandler> clientHandlers;
|
||||
BlockingQueue<NetworkEvent> actionQueue;
|
||||
private EventType eventType;
|
||||
|
||||
public Socket getClientSocket() {
|
||||
return clientSocket;
|
||||
@@ -31,34 +27,25 @@ public class ClientHandler implements Runnable {
|
||||
|
||||
@Override
|
||||
public void run(){
|
||||
clientLoop();
|
||||
}
|
||||
|
||||
private void clientLoop(){
|
||||
try{
|
||||
NetworkEvent input = null;
|
||||
synchronized(in){
|
||||
in = new ObjectInputStream(clientSocket.getInputStream());
|
||||
}
|
||||
out = new ObjectOutputStream(clientSocket.getOutputStream());
|
||||
|
||||
while(true){
|
||||
try{
|
||||
input = (NetworkEvent) (in.readObject());
|
||||
if(!actionQueue.add(input)){
|
||||
System.out.println("An error occurred in inserting an action into queue");
|
||||
NetworkEvent event = (NetworkEvent) in.readObject();
|
||||
if(!actionQueue.add(event)){
|
||||
System.out.println("Error inserting action into queue");
|
||||
}
|
||||
}
|
||||
catch(java.io.IOException e){
|
||||
}
|
||||
catch(IOException e){
|
||||
clientHandlers.remove(this);
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (ClassNotFoundException e){
|
||||
catch(ClassNotFoundException e){
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void notifyEvent(NetworkEvent event){
|
||||
synchronized(out){
|
||||
|
||||
@@ -3,6 +3,7 @@ package it.polimi.ingsw.gc14.Network.TCP.Server;
|
||||
import it.polimi.ingsw.gc14.Controller.GameController;
|
||||
import it.polimi.ingsw.gc14.LimitedList;
|
||||
import it.polimi.ingsw.gc14.Model.Game;
|
||||
import it.polimi.ingsw.gc14.Network.EventType;
|
||||
import it.polimi.ingsw.gc14.Network.NetworkEvent;
|
||||
import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer;
|
||||
|
||||
@@ -14,32 +15,29 @@ import java.util.concurrent.BlockingQueue;
|
||||
|
||||
|
||||
public class TCPServer {
|
||||
int port = -1;
|
||||
int ConnectedPlayers = 0;
|
||||
ServerSocket serverTCP = null;
|
||||
GameController gameController;
|
||||
int port;
|
||||
int ConnectedPlayers;
|
||||
ServerSocket serverTCP;
|
||||
GameController controller;
|
||||
BlockingQueue<NetworkEvent> actionQueue;
|
||||
private LimitedList<String> playerList;
|
||||
private List<ClientHandler> clientHandlers;
|
||||
|
||||
|
||||
|
||||
private int getConnectedPlayers(){
|
||||
return ConnectedPlayers;
|
||||
}
|
||||
|
||||
public void start(){
|
||||
clientHandlers = new ArrayList<>();
|
||||
|
||||
try{
|
||||
serverTCP = new ServerSocket(port);
|
||||
}
|
||||
catch (IOException e){
|
||||
System.out.println("Could not listen on port: " + port);
|
||||
System.out.println("Could not start the server TCP on port: " + port);
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
System.out.println("Listening on port: " + port);
|
||||
System.out.println("Server TCP started on port: " + port);
|
||||
|
||||
while(true){
|
||||
Socket clientSocket = null;
|
||||
@@ -49,34 +47,42 @@ public class TCPServer {
|
||||
ObjectInputStream clientSocketObj = new ObjectInputStream(clientSocket.getInputStream());
|
||||
NetworkEvent event = (NetworkEvent) clientSocketObj.readObject();
|
||||
|
||||
synchronized (gameController){
|
||||
if(!(event instanceof AddPlayer) || (gameController.getModel() != null && gameController.getModel().getCurrentPlayerNumber() >= gameController.getModel().getNPlayers())){
|
||||
if(!(event.getEventType() == EventType.ADD_PLAYER)){
|
||||
clientSocket.getOutputStream().write((int)(-1));
|
||||
clientSocket.close();
|
||||
System.out.println("Invalid parameters. Connection terminated.\n");
|
||||
}
|
||||
else{
|
||||
synchronized (gameController) {
|
||||
AddPlayer addPlayer = (AddPlayer) event;
|
||||
if(playerList.isEmpty() && (addPlayer.getProposedNPlayer() < 2 || addPlayer.getProposedNPlayer() > 5)){
|
||||
clientSocket.getOutputStream().write((int)(-1));
|
||||
AddPlayer eventAddPlayer = (AddPlayer) event;
|
||||
if (eventAddPlayer.getProposedNPlayer() < 2 || eventAddPlayer.getProposedNPlayer() > 5) {
|
||||
clientSocket.getOutputStream().write((int) (-1));
|
||||
clientSocket.close();
|
||||
System.out.println("Invalid parameters. Connection terminated.\n");
|
||||
}
|
||||
else if(gameController.addPlayer(addPlayer.getUsername())){
|
||||
if(playerList.isEmpty()){
|
||||
Game game = new Game(addPlayer.getProposedNPlayer());
|
||||
gameController.setModel(game);
|
||||
playerList.setLimit(addPlayer.getProposedNPlayer());
|
||||
}
|
||||
playerList.add(addPlayer.getUsername());
|
||||
clientSocket.getOutputStream().write((int)(1));
|
||||
}
|
||||
synchronized (controller) {
|
||||
if (playerList.isEmpty()){
|
||||
Game model = new Game(eventAddPlayer.getProposedNPlayer());
|
||||
controller.setModel(model);
|
||||
playerList.setLimit(eventAddPlayer.getProposedNPlayer());
|
||||
}
|
||||
if (controller.addPlayer(eventAddPlayer.getUsername())) {
|
||||
playerList.add(eventAddPlayer.getUsername());
|
||||
clientSocket.getOutputStream().write((int) (1));
|
||||
|
||||
System.out.println("Accepted player: " + eventAddPlayer.getUsername());
|
||||
ClientHandler clientHandler = new ClientHandler(clientSocket, clientHandlers, actionQueue);
|
||||
clientHandlers.add(clientHandler);
|
||||
ConnectedPlayers++;
|
||||
|
||||
Thread t = new Thread(clientHandler);
|
||||
t.start();
|
||||
} else {
|
||||
clientSocket.getOutputStream().write((int) (-1));
|
||||
clientSocket.close();
|
||||
System.out.println("Player could not be added. Connection terminated.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
// gestione di ADD_PLAYER
|
||||
}
|
||||
catch(IOException e){
|
||||
e.printStackTrace();
|
||||
@@ -84,38 +90,17 @@ public class TCPServer {
|
||||
catch(ClassNotFoundException e){
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
System.out.println("Accepted player: " + gameController.getModel().getPlayerByUsername(clientSocket.getInetAddress().toString()));
|
||||
|
||||
ConnectedPlayers++;
|
||||
ClientHandler clientHandler = new ClientHandler(clientSocket, clientHandlers, actionQueue);
|
||||
clientHandlers.add(clientHandler);
|
||||
|
||||
//Sending model to clients
|
||||
if(ConnectedPlayers == gameController.getModel().getNPlayers()){
|
||||
for (ClientHandler handler : clientHandlers) {
|
||||
try {
|
||||
synchronized(handler.out){
|
||||
ObjectOutputStream socketTx = new ObjectOutputStream(handler.getClientSocket().getOutputStream());
|
||||
socketTx.writeObject(gameController.getModel());
|
||||
}
|
||||
}
|
||||
catch(IOException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Thread t = new Thread(clientHandler);
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
|
||||
public TCPServer(GameController gameController, int port, BlockingQueue<NetworkEvent> actionQueue, LimitedList<String> players){
|
||||
this.port = port;
|
||||
this.gameController = gameController;
|
||||
this.ConnectedPlayers = 0;
|
||||
this.serverTCP = null;
|
||||
this.controller = gameController;
|
||||
this.actionQueue = actionQueue;
|
||||
this.playerList = players;
|
||||
this.clientHandlers = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void notifyAll(NetworkEvent event){
|
||||
|
||||
Reference in New Issue
Block a user