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:
Clientcode:
über hilfe würde ich mich freuen
mfg hifish
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