PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Server socket fehlerhaft



noreux
28-06-2005, 22:36
Hallo,
Habe mir nen kleinen Serversocket gemacht, der bisher auch funktioniert hat. Jetzt wollte ich aber dass sich mehrere clients gleichzeitig einloggen können, darum habe ich für den Client nen extra Thread gemacht. Es wird also folgender Code aufgerufen: (tcpserver.java)




import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;



public class tcpserver extends Thread{

public tcpserver() {

}



public void run() {




ServerSocket sock = null; // original server socket

Socket clientSocket = null; // socket created by accept

PrintWriter pw = null; // socket output stream

BufferedReader br = null; // socket input stream





try {


sock = new ServerSocket(5555); // create socket and bind to port


System.out.println("waiting for client to connect");


while (true){

clientSocket = sock.accept(); // wait for client to connect

new ClientThread(clientSocket);



}

sock.close();





} catch (Throwable e) {
// ^-------^ sowas ist absolut schlimm...
System.out.println("Error " + e.getMessage());
e.printStackTrace();

}
}
}



und in einen extra Thread die ClientThread.java:



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


class ClientThread extends Thread {
private Socket clientSocket;

public ClientThread(final Socket clientSocket)
{
this.clientSocket = clientSocket;
}

public void run()
{


System.out.println("client has connected");



PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


pw.println("Hallo");

String g = br.readLine();


if (g.equals("1")) {
pw.println("Du hast 1 gedrückt");
}

if (g.equals("2")) {
pw.println("Du hast 2 gedrückt");
}




pw.close();

br.close();

clientSocket.close();

System.out.println("closed");

sock.close();

}
}


Ich kann es aber nicht compilieren, weil er in der tcpserver.java die Zeile mit "sock.close();" als Fehler anstreicht (unreachable code) und in der ClientThread nur das "sock" von "sock.close();" anstreicht (sock cannot be resolved). Weiß jemand vielleicht was ich an dem code falsch gemacht habe, bzw was man ändern muss dammit er so läuft wie er soll? wäre dankbar für alle tipps,
gruß
noreux

Boron
28-06-2005, 22:39
sock.close() steht direkt nach einer Endlosschleife. Wie soll das Programm da jemals "hinter" die Schleife kommen?

noreux
28-06-2005, 22:42
stimmt, aber selbst wenn ich dieses socket.close() auskommentiere, meckert er noch wegen dem "sock" aus dem ClientThread rum....ne ahnung wie ich das lösen könnte?

Boron
28-06-2005, 22:45
Die Einrückung in der ClientThread.java ruft in mir Brechreiz hervor.
Darum kann ich nur raten, dass "sock" als Variable nicht bekannt ist. Zumindest sehe ich sie nirgendwo sonst inder Klasse ClientThread.

noreux
28-06-2005, 22:48
:) , sorry bin aber ziemlicher Neuling in Java. hmm könntest mir nicht vielleicht n tipp geben wie ich den code lauffähig bekäme? hab da (noch) zu wenig Ahnung von..

es soll jetzt nicht wunderbar stabil und tolerant laufen, mir würds vorerst reichen wenns mal wenigstens halbwegs funktioniert...

anda_skoa
29-06-2005, 13:44
Wie Boron schon sagt gibt es in der Klasse ClientThread keine Variable sock.
Also diese Zeile rausnehmen.

Ciao,
_

noreux
29-06-2005, 16:28
danke, aber das habe ich natürlich auch schon probiert, sobald ich aber sock.close() auskommentiere, markiert er mir weiter oben clientSocket.getOutputStream() und clientSocket.getInputStream() als fehlerhaft (br.readline() und br.close() auch)...

bischi
29-06-2005, 21:16
Wie schon gesagt: Das Zeugs schön einrücken, und genaue Fehlermeldung angeben - sonst kann (und will) dir hier wohl niemand helfen.

MfG Bischi

PS: Falls du von Java noch keine Ahnung hast ist dies definitiv das falsche Beispiel zum Einsteigen! Netzwerkverbindungen sind im allgemeinen eher heikel. Für den Java-Einstieg findest du viele Links auf meiner HP (siehe Sig)

noreux
30-06-2005, 10:51
ich weiß dass es relativ schwer für den Anfang ist, aber mit Netzverbindungen im Allgemeinen kenn ich mich schon aus, bin halt in Java noch nicht so weit, wobei es bisher eigentlich alles funktioniert, nur wenn ich den Server in einen Extra Thread packe gehts nicht mehr, und das wäre aber wichtig, dass mehrere Leute gleichzeitig auf den Server draufkommen...

also mein Hauptthread sieht so aus:



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;



public class tcpserver extends Thread{

public tcpserver() {
}



public void run() {

int x=1;
int serverPort=666;





ServerSocket sock = null;
Socket clientSocket = null;
PrintWriter pw = null;
BufferedReader br = null;


try {


sock = new ServerSocket(serverPort);
System.out.println("waiting for client to connect");



while (x<10)
{

clientSocket = sock.accept();

new ClientThread(clientSocket);


x=x+1;

}


sock.close();





} catch (Throwable e) {
System.out.println("Error " + e.getMessage());
e.printStackTrace();

}
}
}


und so der Thread der aufgerufen wird (ClientThread.java)



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


class ClientThread extends Thread {
private Socket clientSocket;

public ClientThread(final Socket clientSocket)
{
this.clientSocket = clientSocket;
}

public void run()

{




System.out.println("client has connected");



PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


pw.println("Hallo");

String g = br.readLine();


if (g.equals("1")) {
pw.println("Du hast 1 gedrückt");
}

if (g.equals("2")) {
pw.println("Du hast 2 gedrückt");
}




pw.close();

br.close();

clientSocket.close();

System.out.println("closed");


}
}


Nun gibt es aber Fehler beim compilen der ClientThread.java. Er markiert ClientSocket.getOutputStream() und clientSocket.getInputStream() als fehlerhaft (Unhandled Exception type IO Exception). br.readLine(); ist demnach auch fehlerhaft und weiter unten br.close(); und clientSocket.close(); ...

anda_skoa
30-06-2005, 11:14
Der Code ist schon ok.
Der Compiler sagt dir nur, daß du vergessen hast, die Exceptions zu beachten, die die von dir benutzen Methoden werfen können.

Ciao,
_