Zum Inhalt springen

Kadaj

Mitglieder
  • Gesamte Inhalte

    133
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Kadaj

  1. Ja, das hatte ich schon verstanden. Ich meine aber was anderes. Der Server vergibt ja für jede eingehende Verbindung einen extra Port, damit meine ich natürlich für jede Datei, die von einem anderen Client versendet wird, bevor er diese Verbindung dann in einen extra Thread schickt. Trotzdem muss ich ja prüfen ob dieser Port grade schon von einem anderen Client in einem anderen Thread verwendet wird. Immerhin kann man ja einen mehrere Sockets mit dem selben Port erstellen. Wenn es ganz dumm kommt, dann vergibt der Server an 2 Clients den selben Port udn 2 Threads laufen über einen Port. Gruß
  2. Ah, nun verstehe ich das. Das hört sich ja garnichtmal so dumm an, werd ich direkt man umsetzen. Danke euch beiden! Eine Frage aber noch dazu. Wenn ich bei sehr vielen Verbindungen immer einen Port höher gehe, dann muss ich im Fall der Fälle ja irgendwann wieder anfangen von vorne zu zählen. Wenn also der erste Port den ich vergeben habe grade eine gigantische Datei rüberschiebt, die immer noch nicht fertig ist, selbst wenn der Server schon 65000 Daten bekommen hat. Wie kann ich dann überprüfen ob der Port grade noch belegt wird? Trotzdem würde mich auch die Geschichte mit den Namen der Threads interessieren, bzw einen Aufruf über die ID. Haben die Javaentwickler dafür etwas vorgesehen? Gruß
  3. Danke, dass du mitspielst Ich kann dir aber nicht ganz folgen. Also du meinst, dass ich beim ersten lauschen auf eine Verbindung schon im ersten Thread bin? Wie soll das ohne ID funktionieren? Der UDP-Server lauscht auf genau einem Port und bekommt die Daten der verschiedenen Clients doch alle über genau diesen Port rein. Selbst wenn mein Server 3 Threads hat und alle auf verschiedenen Ports lauschen, kann mein Client doch nicht wissen auf welchem Port er senden soll, wenn nicht zuvor festgelegt. Also ich bin in Java noch recht grün hinter den Ohren, vielleicht versteh ich es ja, wenn du etwas weiter ausholst^^ Gruß
  4. Der Socket? der lauscht doch nur auf einem Port. Meinst du das Paket? Ehm, ja anhand der IP-Adresse im Header weiß ich das auch. Ich mach es halt über eine ID, die ganz vorn im Datenteil steht, dann kann ich auch unterscheiden, wenn mehrere Dateien von einem Client kommen. Also die Unterscheidung ist ja nicht das Problem, viel mehr wie ich mit erhaltenen Paketen gleichzeitig umgehe. Ich habe ja für jede Datei einen Dateinamen, wenn ich abwechselnd verschiedene Dateistückchen bekomme, dann würde ich die Pakete einfach an den Thread weitergeben, der die Datei bereits geöffnet hat und schon darauf warten weiter zu schreiben.
  5. Abend, ich möchte folgendes realisieren: mein UDP-Server soll Dateien von verschiedenen Clients entgegen nehmen. Dazu sollen die Pakete mit einer ID versehen werden, damit der Server auch weiß, zu welcher Datei die bytes gehören, die er grade reinbekommt. Dazu soll der Server immer, wenn er die ID 0 liest ( erstes Paket eines neuen Clients ) einen neuen Thread erstellen. Eine Möglichkeit wäre einfach einen int-Wert zu nehmen, den ich vorher als ID für die Verbindung festlege und den Namen des Threads damit versehe, in der Form: dataThread_2. Denn dann könnte ich den Thread immer ganz einfach durch seinen eindeutigen Namen aufrufen. Doch wie puzzle ich mir einen Threadnamen aus Variablen zusammen und rufe ihn auf? In der Shellprogrammierung ist ds ja ganz einfach. Die andere Möglichkeit, die mir durch den Kopf geht wäre, erst den Thread zu erstellen, sich dann seine ID zu holen und diese als ID für die Kommunikation zwischen Server und Client zu verwenden. Dann müsste ich aber bei 20 Threads einen bestimmten durch seine ID aufrufen können. Nur wie? Ich würde gern wissen, ob eine der beiden Möglichkeiten umsetzbar ist, und wenn ja, wie ich das mache. Vielleicht gibt es ja noch eine bessere bzw. saubere/performantere Lösung als Threads. Gruß
  6. Kadaj

    TCP-Dateiübertragung

    Hat sich erledigt; schon ne dumme Frage, wenn man es versteht^^
  7. Kadaj

    TCP-Dateiübertragung

    Gut zu wissen, aber mal was anderes. Unabhängig davon ob ich nun tcp oder udp nehme; angenommen ich packe Daten, die nicht über den header mitgesendet werden können mit in mein erstes Paket bzw. in jedes mit rein. Sei es beispielsweise ein Dateiname. Natürlich kann ich auch das erste Paket nur mit dem Namen ausstatten und losschicken, aber wenn ich Daten mit im Paket habe und diese dann beim auslesen trennen möchte, wie könnte man dann vorgehen? Mein erster Gedanke wäre einfach einen int am Anfang des Paketes zu stecken für die Anzahl Zeichen des Strings, dann die Anzahl Zeichen für den Name der Datei auslesen und den Rest normal als Daten behandeln. Würde das funktionieren? Wenn ich mir ein byte in Größe eines int erstelle und erst damit receive aufrufe, was passiert bei einem weiteren Aufruf von receive? Steht der Zeiger dann wieder am Anfang oder nach dem int? Die Zusammensetzung der Pakete bzw Header ist mir noch etwas schleierhaft. Mit Funktionen wie getAddress() oder getPort() hole ich mir Daten aus dem Header, alles weitere muss ich also in den Datenteil packen? Gruß
  8. Kadaj

    TCP-Dateiübertragung

    Danke! Einleuchtend auf einem Blick, kommt gleich an mein Whiteboard ;-) Ich wusste nicht, dass die Datei dadurch beim übertragen verändert werden kann. Ist das etwa gewollt?
  9. Kadaj

    TCP-Dateiübertragung

    Danke dir, die Zeile System.out.println( new String(buffer) ); [/PHP] ist ne Magie, die ich bisher auch noch nicht kannte. Das funktioiert auch auf Serverseite ;-) Allerdings hab ich den Client jetzt so, da mir gesagt wurde, dass es besser sei die Bytes direkt zu lesen und zu schicken, also ohne BufferedReder etc, weil sonst Konvertierungen vorgenommen werden, die Ergebnis verfälschen könnten? Allerdings leuchtet mir das nicht ganz ein, da der bufferedReader doch nur bytes puffert bevor er sie rausschiebt, oder? [PHP] FileInputStream fis = new FileInputStream("alice.txt"); Socket clientSocket = new Socket("localhost",3000); OutputStream out = clientSocket.getOutputStream(); byte[] buffer = new byte[1024]; while( fis.read( buffer ) != -1 ){ out.write(buffer); }
  10. Gut zu wissen, danke für den Tipp :-)
  11. Hallochen, ich versuche grade eine Textdatei von einem client auf einen server zu schicken und diese dann vom server ausgeben zu lassen. Das hat auch soweit erstmal funktioniert, nur dass der Server die Umlaute nicht darstellen konnte. Ich hab mir den Abschnitt über Netzwerkprogrammierung in Java im Buch von Addison Wesley fertig durchgelesen und ausprogrammiert, leider fande ich das für so ein gewaltiges Thema recht wenig und ich habe bisher auch noch keine bessere Quelle / Buch gefunden, wo mehr darüber erklärt wird ( udp wurde zb ganz weggelassen :/ ) Jedenfalls habe ich nach einigen Beispielen gegoogelt, aber das hat mich nur zurückgeworfen, sodass ich dann beim Server nur noch eine Zeile bei der Ausgabe des Textes habe. Kann mir vielleicht jemand nochmal die Datenübertragung etwas näher bringen und vielleicht auch den Unterschied zu UDP? Erstmal hier meine beiden Klassen: TCP_Client import java.io.*; import java.net.*; public class TCP_Client { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader( new FileReader( "alice.txt" ) ); Socket clientSocket = new Socket("localhost",3000); OutputStream out = clientSocket.getOutputStream(); //DataOutputStream outToServer=new DataOutputStream(clientSocket.getOutputStream()); //BufferedReader inFromServer = new BufferedReader( new InputStreamReader( clientSocket.getInputStream())); LineNumberReader lnr = new LineNumberReader( br ); String line; while( ( line = lnr.readLine() ) != null ){ out.write(line.getBytes()); System.out.println( line ); } out.write('\r'); out.write('\n'); clientSocket.close(); br.close(); //sentence = inFromUser.readLine(); // blockiert /*byte[] buffer = new byte[1024]; while(fileIn.available() > 0){ outToServer.write(buffer,0,fileIn.read(buffer)); }*/ } } [/PHP] TCP_Server [PHP] import java.io.*; import java.net.*; public class TCP_Server { public static void main(String[] args)throws Exception { String clientSentence; //String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(3000); while(true){ Socket connectionSocket = welcomeSocket.accept(); // wartet auf Verbindung vom Client // danach geht es weiter InputStream in = connectionSocket.getInputStream(); // Eingangs-Stream vom Socket holen //BufferedReader inFromClient = new BufferedReader( new InputStreamReader( connectionSocket.getInputStream())); // Stream für Ausgang aufbauen //DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream() ); byte[] buffer = new byte[1024]; // byte zur Übertragung von Daten int c; while( connectionSocket.isConnected() ){ c = in.read(buffer); if(c==-1) break; System.out.write( buffer,0,c ); } /* while( (len = in.read(buffer) ) != -1) { System.out.write(buffer,0,len); } while( true ){ clientSentence = in.readLine(); System.out.println(clientSentence); } */ in.close(); connectionSocket.close(); } } } Wäre super, wenn mir jemand erklären könnte warum keine der auskommentierten Varianten beim Server funktioniert. Wenn ich beispielsweise System.out.println( buffer.toString() ); beim Server verwende, dann bekomme ich ne ganze Menge davon: [B@213214d1 [B@213214d1 [B@213214d1 [B@213214d1 [B@213214d1 [B@213214d1 [B@213214d1 Ist mir schon etwas schleierhaft ...
  12. Kadaj

    PicoJava-Prozessoren?

    Ok, nun hast du mich so heftig mit Dingen überschüttet, die ich noch nicht einmal verstehe, dass ich nur sagen kann: "Verdammt, du hast ja Recht" ^^ Ich hätte den PicoJava aber nicht unbedingt als eine Architektur angesehen, sonder viel mehr als eine Komponente. Die Leute kaufen sich ja Grafikkarten auch nur der besseren Performance wegen, obwohl sie schon eine auf ihrem board haben. ;-)
  13. Kadaj

    PicoJava-Prozessoren?

    Was meinst du damit?
  14. Kadaj

    PicoJava-Prozessoren?

    Ok, ich hätte gedacht, dass geplant ist die PicoJava irgendwann standartmäßig in alle Rechner einzubauen, damit diese dann automatisch alle Java-Anwendungen ausführen. Das würde Anwendungen, die in C++ geschrieben sind, ganz schön alt aussehen lassen, aber damit ist wohl nicht zu rechnen. Schade eigentlich...
  15. Hey Leute, ich hab in einem Javabuch ganz am Anfang gelesen, dass es sogenannte PicoJava-Prozessoren gibt, die den Bytecode direkt ausführen, wodurch Java-Software erheblich schneller wird. Zwischen 20 und 50 mal so schnell hab ich auf verschiedenen Seiten gelesen. Weiß jemand mehr darüber? Sun scheint diese bereits zu verwenden, allerdings finde ich nur wenig Informationen darüber ob diese auch für den "normaler Informatiker" zugänglich sein werden bzw wann überhaupt was geplant ist. Gruß
  16. 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!
  17. 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?
  18. 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.
  19. Ich sollte vielleicht noch erwähnen, dass ich die List.hpp udn die List.cpp getrennt habe. Ich hab die List.cpp erstmal beim kompilieren ausgeschlossen und die Funktionen in die List.hpp gepackt. So würde es funktionieren. Aber mich würde trotzdem interessieren wie ich den Fehler ohne diesen Schritt wegbekomme.
  20. Abend, ich arbeite an einem Programm um Literatur zu verwalten. In einer Klasse "Verwaltung" möchte ich die Listen verwalten. Es geht dabei im die Code-Schnipsel: Verwaltung.hpp: #ifndef __VERWALTUNG_H_ #define __VERWALTUNG_H_ #include "List.hpp" #include "Person.hpp" #include "Date.hpp" #include "Book.hpp" #include "Journal.hpp" #include "Lend.hpp" class Verwaltung{ private: List<Person> Liste_Person; List<Book> Liste_Book; List<Journal> Liste_Journal; List<Lend> Liste_Lend; public: Verwaltung(); // zunächst eine leere Liste erstellen ... ... ... [/PHP] [PHP] #include "Verwaltung.hpp" Verwaltung::Verwaltung(){} ... ... ... Beim Kompilieren bekomme ich die Fehler: /tmp/ccO3rDL8.o: In function `Verwaltung::Verwaltung()': Verwaltung.cpp:(.text+0x15): undefined reference to `List<Person>::List()' Verwaltung.cpp:(.text+0x25): undefined reference to `List<Book>::List()' Verwaltung.cpp:(.text+0x35): undefined reference to `List<Journal>::List()' Verwaltung.cpp:(.text+0x45): undefined reference to `List<Lend>::List()' Verwaltung.cpp:(.text+0x5a): undefined reference to `List<Journal>::~List()' Verwaltung.cpp:(.text+0x6f): undefined reference to `List<Book>::~List()' Verwaltung.cpp:(.text+0x80): undefined reference to `List<Person>::~List()' collect2: Fehler: ld gab 1 als Ende-Status zurück Wenn ich beim Kompilieren die Verwaltung.cpp rausnehme und den Teil in die hpp einfüge: Verwaltung(){} [/PHP] Dann lässt es sich problemlos übersetzen. Ich muss beim Auslagern irgendwas falsch machen. Ich hab jetzt keinen anderen Quellcode gepostet, weil ich nicht sicher bin wo der Fehler liegt. Ich vermute aber, dass er an einer der obrigen Stellen ist. Kann mir jemand die Fehlermeldung etwas näher bringen?
  21. ja, könnte man denken^^ Ist Teil einer Belegarbeit als Prüfungsvorleistung, daher muss ich die selber schreiben
  22. Nein, ist das blöd, Klammern vergessen -.-. Mich hat schon jemand auf den Fehler hingewiesen. Schande über mich...
  23. Hallo, ich schreibe grade an einem Programm zur Bücherverwaltung. Unter anderen habe ich die Klasse String, die folgende Funktion beinhaltet: //Ausgabe des Strings const char* const String::get_String()const{ return buffer; } [/PHP] und die Klasse Lit, die einen Name vom Typ Sting beinhaltet und auch diese Funktion: [PHP] const char* const Lit::get_Name()const{ return Name.get_String; } beim übersetzen bekomme ich diesen Fehler: Lit.cpp: In Elementfunktion »const char* const Lit::get_Name() const«: Lit.cpp:15:14: Fehler: »String::get_String« kann nicht vom Typ »const char* const (String:()const« in den Typ »const char* const« umgewandelt werden Lit.cpp:16:1: Warnung: Kontrollfluss erreicht Ende von Nicht-void-Funktion [-Wreturn-type] [/code] aber ich versteh nicht ganz was das Problem ist, immerhin sind die Typen doch gleich. Kann mir jemand helfen?
  24. Wenn du Win7 hast, müsstest du bereits ein tool auf deinem Rechner haben um die s.m.a.r.t.-Werte abzurufen, andernfalls kann man auch eine Boot-CD nehmen, z.b. Ultimate-Boot-cd oder MTDVD, aber ich glaube nicht, dass das ein anderes Ergebnis bringt, wenn du mit 2 tools schon kein Erfolg hattest. Da wird die Platte wohl einen kleinen Schaden haben. Der "Weg" ist ja immer der gleiche um an die S.M.A.R.T.-Daten zu kommen. Wenn du beispielsweise ne NAS hast, kannst du die Platte da auch mal reinschieben und versuchen die S.M.A.R.T.-Daten abzurufen.
  25. Jaa, es läuft :-D darauf wäre ich ja nie gekommen. Bald werde ich mir eine Hasen-Skulptur ins Zimmer stellen und sie vor jeder Aufgabe anbeten. Vielen Dank, mal wieder ;-)

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...