Gå til innhold

Handtere klienter som får timeout [java.net.Sockets]


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...