Socket macht probleme
lima-city → Forum → Programmiersprachen → Java
byte
code
fehlermeldung
folgende zeile
funktion
message
methode
null
pokern
problem
prototyp
run
server
spieler
string
system
tisch
vermutung
zeile
zuweisung
-
Hey Leute,
ich habe mal eine Frage an euch.Mein Problem ist das eine Socket Zuweisung nicht geht...
also Prototyp der Funktion:
public int add(Socket new_client,int room) throws IOException
in der Funktion macht mir jetzt folgende Zeile probleme:
this.users[room][i] = new_client;
ich konnte es schon auf diese Zeile eingrenzen, da in der Nächsten Zeile steht:
this.send(this.users[room][i], Message.enter, "Willkommen im Pokerraum " + room + " Sie sind der " + ++i + ". Spieler am Tisch");
ändere ich diese jetzt zu
this.send(new_client, Message.enter, "Willkommen im Pokerraum " + room + " Sie sind der " + ++i + ". Spieler am Tisch");
funktioniert die ganze Sache...
ach ja das ganze ist/ soll ein Server (werden).
und hier nochmal die ganze Funktion:
public int add(Socket new_client,int room) throws IOException{ for(int i = 0; i < this.users[room].length;i++){ if(this.users[room][i] == null){ this.users[room][i] = new_client;//DIESE ZUWEISUNG GEHT NICHT, WARUM AUCH IMMER this.send(this.users[room][i], Message.enter, "Willkommen im Pokerraum " + room + " Sie sind der " + ++i + ". Spieler am Tisch"); return ERROR.none; } } return ERROR.room_is_full; }
Und die Fehlermeldung lautet:
java.net.SocketException: Socket is closed
André
ich hoffe ihr könnt mir helfen.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Socket is closed, heißt nicht, dass die Zuweisung fehlgeschlagen ist, sondern, dass nichts über den Socket gesendet werden kann, weil er noch nicht geöffnet wurde. Das Öffnen müsste demnach woanders in dem Quellcode passiert sein bzw. nicht passiert sein.
€dit: Vllt timeout gesetzt und abgelaufen?
public int add(Socket new_client,int room) throws IOException{ for(int i = 0; i < this.users[room].length;i++){ if(this.users[room][i] == null){ this.users[room][i] = new_client;//DIESE ZUWEISUNG GEHT NICHT, WARUM AUCH IMMER if( !this.users[room][i].isClosed() ) { this.send(this.users[room][i], Message.enter, "Willkommen im Pokerraum " + room + " Sie sind der " + ++i + ". Spieler am Tisch"); } else { // Fehlermeldung } return ERROR.none; } } return ERROR.room_is_full; }
Damit müsste es sich testen lassen. Musst nur eine passende Fehlerausgabe einfügen und schaun was passiert.
Beitrag zuletzt geändert: 12.3.2010 21:29:21 von reimann -
also jetzt bekomme ich immerhin noch die Willkommensnachricht, aber der Inputstream kann nicht mehr geöffnet werden.-->
public void run(){ long x = 0; while ( true ) { for(int i = 0; i < this.users.length;i++){ for(int j = 0; j < this.users[i].length;j++){ if(this.users[i][j] == null) continue; try { InputStream in = this.users[i][j].getInputStream(); int mt = in.read(); System.out.println("recieved: " +mt); if(mt == Message.leave){ System.out.println(this.users[i][j] + " has left"); this.users[i][j] = null; this.notifyUsers(i); }else if(mt == Message.chat){ System.out.println("chatet"); byte[] b = new byte[500]; in.read(b); System.out.println(new String(b)); this.notifyUsers(i,new String(b)); } in.close(); }catch(IOException e ){ e.printStackTrace(); System.out.println(x); System.exit(-1); } x++; } } } }
allerdings wird der socket auch nur in dieser Funktion geschlossen wenn der user geht, aber ich bekomme keine Konsolen ausgabe.
Andre
oh und die Fehlermeldung:
0 java.net.SocketException: socket closed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocketInputStream.read(SocketInputStream.java:182) at games.Poker.run(Poker.java:70) at java.lang.Thread.run(Thread.java:619) Java Result: -1
-
Naja in dem Fall wird er nicht in dem Sinne geschlossen, sondern einfach nur dem Garbage Collector überlassen. Ansonsten verwendet man die Methoden close(), um den zu schließen, was in dem Fall aber nicht nötig ist, um den Fehler zu beheben.
Kann denn der InputStream irgendetwas lesen, oder ist da garnichts? Weil konkret wüsste ich auch nicht wos hängen könnte. Heißt halt nur, dass der Socket nicht offen ist und weiß nicht, inwieweit man den speziell nochmal per connect() verbinden muss, vllt mal testweise ausprobieren, ob es dann funktioniert.
Vllt hilft auch die Methode setKeepAlive( true ) weiter.
Kann da leider nur Vermutungen ansstellen.
Beitrag zuletzt geändert: 12.3.2010 22:08:10 von reimann -
also, leider hat setKeepAlive(true) nichts genutzt....
ja der Server also damit auch der InputStream bekommt Daten gesendet. vorerst nur Chatnachrichten und enter, leave hinterher aber noch viel mehr....
ich ärgere mich jetzt auch schon länger mit dem Problem rum, leider kenne ich mich dabei aber nicht so stark aus...
andre -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage