Kadaj Geschrieben 15. November 2012 Teilen Geschrieben 15. November 2012 Hallo, ich versuche mich grade an Socket-Programmierung und habe aus einem Buch ein Programm abgeschriebenm welches Daten Senden soll und diese dann wieder in einem Thread empfangen und ausgeben. Das ganze mache ich unter Eclipse unter Fedora17. Ich hatte zuvor schon einen Ping-Client udn Ping-Server geschrieben, der auf einem anedren Fedora-System auch funktioniert hatte, unter meinem neu aufgespielten aber beim Schließen des Sockets ( serverseitig ) noch eine seltsame Fehlermedung hinterherschmeißt. Aber vielleicht hilft ja erstmal das Programm aus dem Buch: import java.io.*; import java.net.*; public class Read_Write { public static void main(String[] args){ String S = null; System.out.println("Host angeben:"); try{ BufferedReader eingabe = new BufferedReader( new InputStreamReader(System.in) ); S = eingabe.readLine(); Socket sock = new Socket(S,7); InputStream in = sock.getInputStream(); OutputStream out = sock.getOutputStream(); sock.setSoTimeout(300); //Ausgabethread erzeugen OutputThread th = new OutputThread(in); th.start(); //Schleife für Benutzereingaben BufferedReader conin = new BufferedReader( new InputStreamReader(System.in) ); String line = ""; while(true){ line = conin.readLine(); if( line.equalsIgnoreCase("QUIT") ){ break; // Eingaben machen bis "QUIT" eingegeben wurde } out.write(line.getBytes()); out.write('\r'); out.write('\n'); // Ausgbe abwarten th.yield(); } //Programm beenden System.out.println("Beende.."); th.requestStop(); th.yield(); try{ Thread.sleep(1000); }catch( InterruptedException e ){} sock.close(); }catch(Exception e){ System.err.println(e.toString()); e.printStackTrace(); System.exit(1); } } } class OutputThread extends Thread { InputStream in; boolean stoprequested; public OutputThread( InputStream in ){ super(); this.in = in; stoprequested = false; } public synchronized void requestStop(){ stoprequested = true; } public void run(){ int len; byte[] b = new byte[100]; try { while (!stoprequested) { try{ if ((len = in.read() == -1) { break; } System.out.write(b, 0, len); } catch (InterruptedIOException e) { //nochmal versuchen } } }catch(IOException e) { System.err.println("OutputThread: " + e.toString()); } } } [/PHP] Beim Ausführen dann der Fehler: [code] [kadaj@atheros bin]$ java Read_Write Host angeben: localhost java.net.ConnectException: Verbindungsaufbau abgelehnt java.net.ConnectException: Verbindungsaufbau abgelehnt at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528) at java.net.Socket.<init>(Socket.java:425) at java.net.Socket.<init>(Socket.java:208) at Read_Write.main(Read_Write.java:15) [/code] Ich versteh nicht was das Problem ist, immerhin ist das Beispiel aus einem Buch abgeschrieben, mit dem Unterschied, dass der Server als Argument übergeben wird und ich eine Benutzereingabe eingebaut habe. Kann das Problem an Eclipse liegen? Ich wundere mich auch, dass beim Erstellen einer neuen Klasse die main-Funktion nicht automatisch mit eingefügt wird, was auf meiner vorigen Fedora-Version der Fall war. Kennt vielleicht jemand das Problem und kann mir helfen? Die Suche nach dieser Fehlermeldung hat mich leider nicht weiter gebracht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joey P Geschrieben 16. November 2012 Teilen Geschrieben 16. November 2012 Versuch doch mal zu debuggen und schau dir an an welcher Stelle er raus springt... Was die Main Funktion angeht musste ein Häkchen setzen bei "generate int main()" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tom87 Geschrieben 16. November 2012 Teilen Geschrieben 16. November 2012 (bearbeitet) Hallo Kadaj, vermute das hier der Fehler liegt: Socket sock = new Socket(S,7); du übergibst dem Konstruktor 2 Argumente, einmal die IP-Adresse und einmal die Portnummer. Die Portnummer 7 gehört zu den Standardports. Versuchs mal mit einer zwischen 1024–49151 EDIT: Port 7 sollte der Echo-Dienst sein, wenn dieser Dienst nicht läuft bekommt man eine Exception (java.net.ConnectException: Connection refused: connect) Bearbeitet 16. November 2012 von Tom87 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 16. November 2012 Autor Teilen Geschrieben 16. November 2012 (bearbeitet) Hey, danke für eure Hilfe. Beim Debugging hab ich erstmal etwas unwissend reingeschaut. Ich hab keine Option gefunden für "generate int main", sollte es nicht auch void heißen? Ich konnte auch nicht erkennen wo das Programm sich gade befindet. Vielleicht ist es bei "Fedora Eclipse" etwas anders angeordnet? Jedenfalls bin ich mir sicher, dass er rausspringt, sobald ich eine Verbindung zum localhost aufbauen möchte. Liegt es vielleicht nicht an Ecplise oder am Code sondern am Betriebssystem? Ich hab die Firewall auch mal ausgeschalten und den Port auf 3000 gesetzt und das Programm zusätzlich als root ausgeführt. Die Berechtigung sollte ich auf jeden Fall haben. Ich werd im Laufe des Tages mal versuchen das Programm auf eine Client und einem Server zur verteilen. Übringens nehme ich zum Erlernen von Socket-Programmierung das Buch "Addison Wesley - Handbuch Der Java-Programmierung". Im Laufe der ersten 500 Seiten habe ich gemerkt, dass zwar alles gut erklärt ist aber für den Umfang an Information sehr wenig Beispiele zum nachbauen vorhanden sind. So, dass ich dazu neige, das Gelesene wieder zu vergessen^^ Da ich erstmal die nächsten Tage einen Beleg (Sockets) programmieren muss, hab ich erstmal 500 Seiten übersprungen. Sockets sind dafür wieder ganz gut erklärt, auch mit Beispielen. Oder kennt jemand vielleicht was besseres um sich umfangreiches Wissen für Netzwerkprogrammierung anzueignen? Bearbeitet 16. November 2012 von Kadaj Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tom87 Geschrieben 16. November 2012 Teilen Geschrieben 16. November 2012 Hallo Kadaj, nochmals zu deinem Problem: Du hast einen Client geschrieben der eine Verbindung zu einem Dienst aufbauen möchte, und zwar auf deinem Localhost unter Port 7... dein Problem wird sein, dass auf Port 7 kein Dienst läuft. Blätter bei deinem Buch mal auf Seite 1164 (Vorausgesetzt natürlich du hast Auflage 6), sonst schau im Inhaltsverzeichnis nach "ECHO-Server für Port 7" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 16. November 2012 Autor Teilen Geschrieben 16. November 2012 Hey, das war es :-) vielen Dank! Ich hätte solange nicht mit dem Buch weiter gemacht, bis ich nicht den Fehler gefunden hätte... das wäre ein langes Buch geworden^^ Jetzt funktioniert es auch, übrigens war es bei mir Seite 1139 / 1140 ;-) Danke dir! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast runtimeterror Geschrieben 16. November 2012 Teilen Geschrieben 16. November 2012 Noch als Ergänzung: "main" ist in Eclipse ein Template. Ich stelle nach dem Erstellen der Klasse meist fest, dass ich den besagten Schalter zu setzen vergessen habe. Dann einfach den Cursor in den Klassen-Body, main eintippen und mit Strg+Leertaste das Template auswählen und bestätigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 19. November 2012 Autor Teilen Geschrieben 19. November 2012 Gut zu wissen, danke für den Tipp :-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.