Server Client, es kommt nichts an.

Status
Nicht offen für weitere Antworten.
H

hifish

Gast
jo, der titel ist mein problem

ich habe um mich mit der materie mal etwas vertrauter zu machen einen client geschrieben, der server ist ein beispiel aus einem buch, leicht verändert.

das problem ist:

der client sendet eine anfrage für eine datei, der server kriegt diese, lädt die datei und sendet diese zurück. allerdings empfängt der client diese nicht.

ich werde daraus nicht schlau, ich entdecke keine fehler...

Servercode:

Code:
//File Server
//Muss beim starten ein Port als Argument mitübegeben werden

import java.net.*;
import java.io.*;
import java.util.*;

public class FileServer {
	public static void main (String argv[] ) throws IOException {
		ServerSocket ss = new ServerSocket(Integer.parseInt(argv[0]));
		System.out.println("Server started");
		while ( true )
			new FileServerConnection( ss.accept() );
	}
}

class FileServerConnection extends Thread {
	Socket sock;
	FileServerConnection ( Socket s ) {
		sock = s;
		setPriority( NORM_PRIORITY -1 );
		start();
	}
	
	public void run() {
		try {
			OutputStream out = sock.getOutputStream();
			String req = new DataInputStream(sock.getInputStream()).readLine();
			System.out.println( "Request: "+req );
			
			try {
			FileInputStream fis =  new FileInputStream ( req );
			byte [] data =  new byte [ fis.available() ];
			fis.read( data );
			
			System.out.println( "Size: " + String.valueOf(data.length) + " bytes" );
			
			out.write( data );
			}
			catch ( FileNotFoundException e ) {
				System.out.println("Error: File not Found");
			}
		}
		catch ( IOException e ) {
			System.out.println( "I/O error " + e );
		}
	}
}

Clientcode:
Code:
//File Client
//Sruktur für adresseingabe: ip:port/datei
//Um die Funktion der Adressenspeicherung benutzen zu können muss die Datei 
//savedata.txt im gleichen Verzeichiss existieren

import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
	
		
class FileClient extends Frame {
	TextArea textArea = new TextArea( 20, 80 ); //Status Feld
	TextField textField = new TextField( 70 ); //Adressen Zeile
	byte [] data; //Datenspeicher für Datei
	String host, datei;
	int port;
	
	FileClient() { //Bedienungsoberfläche
		super("FileClient");
		
		//Panel für Textobjekte
		Panel pal = new Panel();
		pal.add( textField );
		Button bl = new Button("Last");
		pal.add( bl );
		
		Panel pt = new Panel();
		pt.setLayout( new BorderLayout() );
		pt.add( "North", pal );
		pt.add( "Center", textArea );
		
		
		//Panel für Buttons
		Panel pb = new Panel();
		
		//Button Anfordern
		Panel pb2 = new Panel();
		Button ba = new Button("Anfordern");
		pb2.add( ba );
		pb.add( "West", pb2 );
		
		//Button Speichern
		pb2 = new Panel();
		Button bs = new Button("Speichern");
		pb2.add( bs );
		pb.add( "Center", pb2 );
		
		//Button Beenden
		pb2 = new Panel();
		Button bb = new Button("Beenden");
		pb2.add( bb );
		pb.add( "East", pb2 );

		
		//Frame zusammensetzen
		add( "Center", pt );
		add( "South", pb );
		pack();

	}
	
	private void readAdress() { //String aus Eingabezeile in Adresse und Datenanforderung aufsplitten
		boolean b = true;
		
		StringTokenizer st = new StringTokenizer( textField.getText(), "/:" );
		
		host = st.nextToken();
		port = Integer.valueOf( st.nextToken() );
		
		datei = new String( st.nextToken() );
		while ( b == true ) {
			if ( st.countTokens() <= 0 ) {
				b = false;
			}
			else {
				datei = datei + "/" + st.nextToken();
			}
		}
		write( "Request: " + datei );
	}
	
	private void connect() { //Verbindung aubauen, Anfrage senden, Datei empfangen
		
		try {
			Socket server = new Socket( host, port);
			
			OutputStream out = server.getOutputStream();
			out.write( datei.getBytes() );
			InputStream in = server.getInputStream();
			data = new byte[ in.available() ];
			in.read( data );
			
			write( "Size: " + String.valueOf( data.length ) + " bytes" );
			
			server.close();
		}
		catch ( IOException e ) {
			write( "ERROR: File Could not be loaded" );
		}		
	}
	
	private void saveFile() { //Datei speichern
		Frame f = new Frame();
		FileDialog fd = new FileDialog( f, "Save File", FileDialog.SAVE );
		fd.show();
		try {
			FileOutputStream fos = new FileOutputStream( fd.getFile() );
			fos.write( data );
			
			write( "Saved as: " + fd.getFile() );
		}
		catch ( IOException e ) {
			write( "ERROR: File could not be saved" );
		}
	}
		
	private void write( String s ) { //Methode um Text im Status Feld auszugeben
		textArea.setText( textArea.getText() + s + "\n" );
	}
	
	private void saveAdress() { //Speichert String aus der Eingabezeile in einer txt
		File savedata = new File("savedata.txt");

		if ( !savedata.canRead() ) {
			return;
		}
		else {
			try {
				FileOutputStream fos = new FileOutputStream( savedata );
				fos.write( ( textField.getText() ).getBytes() );
				write( "Adress " + textField.getText() + " saved" );
			}
			catch ( IOException e ) {  }
		}
	}
	
	private void openAdress() { //Öffnet txt und gibt den gespeicherten String wieder in die Eingabezeile
		File savedata = new File("savedata.txt");

		if (!savedata.canRead() ) {
			return;
		}
		else {
			try {
				FileInputStream fis = new FileInputStream( savedata );
				byte [] sdata =  new byte [ fis.available() ];
				fis.read( sdata );
				textField.setText( new String( sdata, 0 ) );
				write( "Adress " + new String( sdata, 0 ) + " opened" );
			}
			catch ( IOException e ) {  }
		}
	}
	
	public boolean action( Event e, Object arg ) { //Methode für Buttons
		if ( arg.equals("Last") ) {
			openAdress();
			return true;
		}
		if ( arg.equals("Anfordern") ) {
			readAdress();
			connect();
			saveAdress();
			return true;
		}
		if ( arg.equals("Speichern") ) {
			saveFile();
			return true;
		}
		if ( arg.equals("Beenden") ) {
			dispose();
			return true;
		}
		return false;
	}
	
	public static void main( String [] arg ) {
		new FileClient().show();
	}
}

über hilfe würde ich mich freuen

mfg hifish
 
B

Beni

Gast
Ich denke, ein Problem könnte das hier sein:
Code:
         FileInputStream fis =  new FileInputStream ( req );
         byte [] data =  new byte [ fis.available() ];
         fis.read( data );
Wenn du in der API nachliest, wirst du sehen, dass die Methoden nicht das machen, was man auf den ersten Blick meinen könnte.
available liefert nur die Anzahl Bytes die direkt (ohne blockieren) gelesen werden können.
read liest nur ein paar Bytes, soviele wie gerade erhältlich sind.

-> Benutz die Länge der Datei (File#length()) und lies in einer Schleife:
Code:
byte[] data = new byte[ file.length() ];
int read = 0;
while( read < data.length )
  read += fin.read( data );

Beim Client gibts ähnliche gefährliche Manöver... schick besser die Dateilänge zuerst durch die Verbindung als available zu benutzen.

Falls das nichts hilft: bring eine genauere Fehlermeldung :wink:
 
H

hifish

Gast
hm, das mit file.length() klappt nicht weil das die string-länge der datei wiedergibt, also bla.blubb hat file.length() 9 unabhängig von der größe der datei.

das lesen der datei über FileInputStream mit .available() klappt aber auch ohne probleme auch für dateien im bereich von mehreren mb

allerdings war der tipp mit dem übergeben der Dateilänge an den client eine gute idee, jetzt kommt was an. .available hat beim InputStream wirklich den wert 0 ausgegeben. allerdings klappt es auch nur bei dateien die sich im bereich von ein paar kb bewegen, größere dateien werden nicht ganz übermittelt, da gibt der Server ne IOException aus, da muss ich nochmal schauen ob ich das nicht mit BufferedInputStream und BufferedOutputStream oder so regel.

auf jeden fall danke, jetzt bin ich nen schritt weiter :D
 
B

Beni

Gast
hm, das mit file.length() klappt nicht weil das die string-länge der datei wiedergibt, also bla.blubb hat file.length() 9 unabhängig von der größe der datei.
Ah, leg dir ein File-Objekt an, und frag es nach der Grösse :wink:

Um das Lesen/Schreiben sollte eine Schleife, dann kann das Teil auch mehrere kleine Teile verschicken...
 
H

hifish

Gast
hab ich doch, aber das gibt dann die String länge an, ich habs ausprobiert.
in meinem falle wäre das req.length(), und das gibt die länge des Strings an, hab das mit meheren verschiedenen dateien ausprobiert, ich hatte jeweils immer die menge der buchstaben und nicht die dateigröße
 
G

Guest

Gast
ups, du hast recht, sorry, hab in meinem server ja kein file-objekt :oops:

ich probiers heute nachmittag mal aus :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
K Java Client > Python Server Java Basics - Anfänger-Themen 0
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
E Client Server Java Basics - Anfänger-Themen 12
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
O Server Client Problem Java Basics - Anfänger-Themen 2
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
X Applet - Client/Server Java Basics - Anfänger-Themen 2
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
D Client-Server Problem Java Basics - Anfänger-Themen 2
J Netzwerkrprogammierung Client - Server Java Basics - Anfänger-Themen 3
J Netzwerkprogrammierung Client/Server Java Basics - Anfänger-Themen 16
G ArrayListe vom Server nach Client schicken Java Basics - Anfänger-Themen 17
G JMS -> Wie Anmeldung vom Client an Server? Java Basics - Anfänger-Themen 4
I Server / Client Programm wie einen String übergeben? Java Basics - Anfänger-Themen 6
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
G Java Server Client Programmierung Java Basics - Anfänger-Themen 3
B Bild/Datei von einem Server an einen Client senden Java Basics - Anfänger-Themen 6
D Server/Client Java Basics - Anfänger-Themen 8
G [Hilfe] Fileupload: Client-Server Java Basics - Anfänger-Themen 9
S Server/Client Verbindung Java Basics - Anfänger-Themen 2
G Dateidownload Client-Server (jsp) Java Basics - Anfänger-Themen 4
G Zugriff vom 'Server auf Client' Java Basics - Anfänger-Themen 4
S Client-Server Java Basics - Anfänger-Themen 18
X client soll bat auf server ansprechen Java Basics - Anfänger-Themen 7
C client/server programm fehler ! Java Basics - Anfänger-Themen 20
C string über server/client verbindung senden ? Java Basics - Anfänger-Themen 4
K [servcer/Client] Suche Server /Client Tutorial. Java Basics - Anfänger-Themen 2
FireHorses Benutzernamen aus PrivateChannel(Interaction) auf Server bringen Java Basics - Anfänger-Themen 0
HolyFUT Best Practice Architektur WebSocket Server Java Basics - Anfänger-Themen 1
S Server Java Basics - Anfänger-Themen 4
S Server Java Basics - Anfänger-Themen 3
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
W Netwerkprogrammierung und Http Server Java Basics - Anfänger-Themen 10
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
U Erste Schritte Server will nicht übergebenes Objekt speichern Java Basics - Anfänger-Themen 5
B IP Adresse von Wildfly Server Java Basics - Anfänger-Themen 1
cezary Server läßt sich nicht starten Java Basics - Anfänger-Themen 2
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
H java.lang.NoClassDefFoundError Run as>> Run on Server Java Basics - Anfänger-Themen 2
F String zu einem Server senden Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
T Eclipse - GlassFish Server!? Java Basics - Anfänger-Themen 1
I Java Server Faces mit Glassfish Webseite veröffentlichen Java Basics - Anfänger-Themen 4
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
Screen Wie Propertydatei im Server beschreiben? Java Basics - Anfänger-Themen 7
K threaded server Java Basics - Anfänger-Themen 18
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
L Chat server Java Basics - Anfänger-Themen 4
B Java Server Side Java Basics - Anfänger-Themen 14
G JObjekte dynamisch vom Server erzeugen lassen Java Basics - Anfänger-Themen 4
A Server logs auslesen Java Basics - Anfänger-Themen 6
Z Threads, Server, GUI Java Basics - Anfänger-Themen 4
M Java class auf Server starten Java Basics - Anfänger-Themen 5
U Java-Programm auf einem Server starten Java Basics - Anfänger-Themen 33
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
S .Bat Server von .java Starten Java Basics - Anfänger-Themen 5
L Server mit mehreren Clients Java Basics - Anfänger-Themen 25
M daytime-Server Port 13 Java Basics - Anfänger-Themen 2
O (von Applet) daten an Server übergeben Java Basics - Anfänger-Themen 4
W mehrere clients auf einem server Java Basics - Anfänger-Themen 2
R Server-Daten sichern/verschlüsseln Java Basics - Anfänger-Themen 10
N Applets: Objekte vom Server laden Java Basics - Anfänger-Themen 4
V pfad.exists() gilt nicht für "//server/a/xyz.jpg"? Java Basics - Anfänger-Themen 12
F SQL Server aus Umlaute werden Fragezeichen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben