entername Skrevet 5. mars 2013 Del Skrevet 5. mars 2013 Hei Eg laga ein enkel klasse kalt ConnectionManager som skal oprette kopling mellom ein server og ein klient. Serveren køyrer eit banalt lite spel. Det eg lurer på er egentlig korleis eg skal kunne sjå kva klient som blir fråkopla eller som eventuelt får ein timeout (ergo blir ufrivillig fråkopla) iløpet av spelet. ConnectionManager klassen er ein utvidelse av Runnable interfacet og køyrer i ein eigen tråd so kva som skjer ellers i spelet har ingen betydning for denne problemstillinga her. Kode for ConnectionManager: public class ConnectionManager implements Runnable { private Vector<Player> players; private ServerSocket listeningSocket; private int maxPlayers; private Stack<String> console; @Override public void run() { try { if (players.size()!=maxPlayers) { Socket newPlayerSocket = listeningSocket.accept(); Player newPlayer = new Player("" + players.size(), newPlayerSocket.getInputStream(), newPlayerSocket.getOutputStream()); console.add("Player " + players.size() + " connected from IP adress " + newPlayerSocket.getInetAddress().getHostAddress()); players.add(newPlayer); newPlayerSocket.is } else { console.add(new Date().toString() + " - Server is full!"); } } catch (IOException e) { console.add("IOException occuredd during connection attempt at " + new Date().toString()); // e.printStackTrace(); } } Sakens kjerne er jo her å vete kva Player object i players vectoren som er assosiert med Socket instansen som kasta feilen. Første steg i denne prosessen er jo å få ut ein eller anna form for informasjon frå feilmeldinga som kan identifisere den aktuelle Socket instansen som kasta feilen. NB: Bør eg lagre Socket instansen til kvar spelar i Player klassen framfor å berre lagre Input-/Output-Stream objektet? Lenke til kommentar
alpheex Skrevet 7. mars 2013 Del Skrevet 7. mars 2013 Er ikke helt sikker på hva du spør om her, men hvis det blir kastet en IOException så vil ikke player-objektet bli lagt til i players vektoren i det hele tatt. Hvis du deklarerer socket før try-catch-blokken, så har du tilgang til denne i catch blokken. Eller du kan ha flere try/catch blokker. eks. try { Socket newPlayerSocket; if (players.size()!=maxPlayers) { newPlayerSocket = null; newPlayerSocket = listeningSocket.accept(); Player newPlayer = new Player("" + players.size(), newPlayerSocket.getInputStream(), newPlayerSocket.getOutputStream()); console.add("Player " + players.size() + " connected from IP adress " + newPlayerSocket.getInetAddress().getHostAddress()); players.add(newPlayer); newPlayerSocket.is } else { console.add(new Date().toString() + " - Server is full!"); } } catch (IOException e) { // newPlayerSocket == null -> listeningSocket.accept() kastet // ellers newPlayerSocket.get(In-/Out)putStream() kastet console.add("IOException occuredd during connection attempt at " + new Date().toString()); // e.printStackTrace(); } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå