File über Socket lesen

Z

Zackwlg

Gast
Hallo,

ich versuche seit Tagen irgendeine Textdatei über eine Socketverbindung zu senden. Es sind drei Dateien: der Fileserver gibt das Verzeichnis vor (C:) und startet pro client eine Verbindung (ConnectionHandler). Der ConnectionHandler bietet für jede Verbindung seine Dienste an wie Verzeichnisinhalt anzeigen (index) oder Datei anzeigen (get). Die Anzeige des Verzeichnisinhalts über index funktioniert. Die Anzeige einer Datei beim client leider nicht. Mit einer while (true) Schleife versuche ich die Zeile zu zählen. Diese Anzahl soll dem Client übermittelt werden, womit er dann die Ausgabe über eine for Schleife steuern kann. Leider wird der Code im ConnectionHandler nach dieser while (true) Schleife nicht mehr erreicht. Das Problem ist also, dass ich die Ausgabe der Datei nicht hin bekomme. Ein Datei soll zeilenweise zum Client gesendet werden und dort zeilenweise angezeigt werden. Ich bin für jeden Tipp dankbar. Hier meine Dateien:

FileServer
Java:
 import java.net.*;
  import java.io.*;

  public class FileServer {

    static final int LISTENING_PORT = 4020;

    public static void main(String[] args) {

      File directory; // Directory with privided Files
      ServerSocket listener; // Listens for connection requests.
      Socket connection; // A socket for communicating with a client.

      
      directory = new File("C:\\");
      
      // Check if directory is available 
      if ( ! directory.exists() ) {
        System.out.println("directory does not exist.");
        return;
      }
      if (! directory.isDirectory() ) {
        System.out.println("The file is not a directory.");
        return;
      }

      /* Listen for connection requests and then create a thread (ConnextionHandler)
         server is terminated by a CONTROL-C. */

      try {
        listener = new ServerSocket(LISTENING_PORT);
        System.out.println("Listening on port " + LISTENING_PORT);
        while (true) {
          connection = listener.accept();
          new ConnectionHandler(directory,connection);
        }
      }
      catch (Exception e) {
        System.out.println("Server shut down unexpectedly.");
        System.out.println("Error: " + e);
        return;
      }

  } 
  }


ConnectionHandler

Java:
 import java.net.*;
import java.io.*;

class ConnectionHandler extends Thread {
     // a ConnectionHandler (thread) for each client

    File directory; // directory with provided files
    Socket connection; // client connection
    DataInputStream incoming; // reading data from the client
    PrintWriter outgoing; // sending data to the client
   

    ConnectionHandler(File dir, Socket conn) {
       // Constructor with connection and directory
    	
      directory = dir;
      connection = conn;
      start();
    }

    void sendIndex() throws Exception {
       // Send the content of the directory after an index command
      String[] fileList = directory.list();
      int flen = fileList.length;
      outgoing.write(flen);
      for (int i = 0; i < fileList.length; i++)
        outgoing.println(fileList[i]);
      outgoing.flush();
      outgoing.close();
      if (outgoing.checkError())
        throw new Exception("Error while transmitting data.");
    }

        
    
    void sendFile(String fileName) throws Exception {
       // send the content of the file after a get command
    	
      File file = new File(directory,fileName);
      
      
      if ( (! file.exists()) || file.isDirectory() ) {
         // check if file exists and is not a directory
        outgoing.println("error sendFile");
      }
      else {
    	  
        outgoing.println("ok sendFile");
        BufferedReader fileIn = new BufferedReader(new FileReader(file));
               
        int t = 0;
        while (true) {
            // count lines from the file
           String line = fileIn.readLine();
          t = t+1;
           }
        int k = t;    // this code is unreachable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        outgoing.write(k); // for printing on client side for (int t = 0; t<flength;t ++) ...
                
               
        while (true) {
            // send lines from the file to the client
           String line = fileIn.readLine();
           outgoing.println(line);
           }
      }
      outgoing.flush();
      outgoing.close();
      if (outgoing.checkError())
        throw new Exception("Error while transmitting data."); 
    }

   
	public void run() {
       // thread method
       // build streams, processed client command index or get
      String command = "Command not read";
      
      try {
    	BufferedReader incoming  = new BufferedReader(new InputStreamReader( connection.getInputStream()));
        outgoing = new PrintWriter( connection.getOutputStream() );
        command = incoming.readLine();
        
        if (command.equals("index")) {
          sendIndex();
        }
        else if (command.startsWith("get")){
          String fileName = command.substring(3).trim();
          sendFile(fileName);
        }
        else {
          outgoing.println("unknown command");
          outgoing.flush();
        }
        System.out.println("OK " + connection.getInetAddress() + " " + command);
      }
      catch (Exception e) {
        System.out.println("ERROR " + connection.getInetAddress() + " " + command + " " + e);
      }
      finally {
        try {
          connection.close();
        }
        catch (IOException e) {
        }
      }
    }

   }


FileServerClient

Java:
 import java.io.*;
import java.net.*;


public class FileServerClient{
	// the client
	
	public FileServerClient(String[] args){
		
		String host = "localhost";
		int port = 4020;
		
		//checks for args
		if(args.length == 2){
			host = args[0];
			port = Integer.parseInt(args[1]);
		}
		
		//build socket and streams
		try{
			Socket s = new Socket(host, port);
			System.out.println("\nConnected with FileServer");
			System.out.println("Typ . for exit");
			System.out.println("Please type index for a list of files or get <filename> for viewing   \n");
			
			BufferedWriter writeToNet = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			BufferedReader readFromNet  = new BufferedReader(new InputStreamReader( s.getInputStream()));
			BufferedReader userInputStream = new BufferedReader(new InputStreamReader(System.in));
			String userInput;
			
			// processed user input
			while(!(userInput = userInputStream.readLine()).equals(".")){
				
				//show content of directory
				if (userInput.equals("index")){
					writeToNet.write(userInput, 0, userInput.length());
					writeToNet.newLine();writeToNet.flush();
					int flength = readFromNet.read();
					System.out.println(flength + " Dateien");
					for (int t = 0; t<flength; t ++){
						System.out.println("Echo: " + "\"" + readFromNet.readLine() + "\"");
						}}
				//show content of file
				else if (userInput.startsWith("get")){
					userInput.trim();
					writeToNet.write(userInput, 0, userInput.length());
					writeToNet.newLine();writeToNet.flush();
					System.out.println("Echo: " + "\"" + readFromNet.readLine() + "\"");
					int flength = readFromNet.read(); //unfortunately, doesn't work
					
					// certainly, it also doesn't work
					for (int t = 0; t<flength;t ++) {
						System.out.println("Echo: " + "\"" + readFromNet.readLine() + "\"");
				          
						
						}}
				else {System.out.println("unknown command");}
				
			}
			
			// close connection
			readFromNet.close();
			writeToNet.close();
			userInputStream.close();
			s.close();
		
		}
		catch(UnknownHostException uhe){
			System.err.println("unknown host: " + host);
		}
		catch(IOException ioe){
			System.err.println("IOException at connection with: " + host + " on Port #" + port);
		}	
	
	}

	

	public static void main(String[] args){
		
		new FileServerClient(args);
	}
}


Gruß Zack
 

madboy

Top Contributor
Was erwartest du, wann die while-Schleife aufhört? while(true) tut genau das, was es soll: durch laufen bis in alle Ewigkeit ;-)

Java:
        while (true) {
            // count lines from the file
           String line = fileIn.readLine();
          t = t+1;
           }

Versuche es mal so:

Java:
        while (fileIn.readLine() != null) {
            // count lines from the file
          t = t+1;
           }

das selbe noch mal 5 Zeilen weiter unten im ConnectionHandler
 

ARadauer

Top Contributor
hast du jetzt 200 Zeilen Code gepostet, weil dein Einlesen vom File nicht funktioniert?

Java:
String line = null;        
        while ((line = fileIn.readLine()) != null) {
          System.out.println(line);       
        }
Probleme eingrenzen ist ganz wichtig beim Fehler suchen ;-)
 
Z

zackwlg

Gast
Hallo madboy,

erst mal Danke für die schnelle Antwort. Ich habe beide Schleifen geändert. So funktionierts:


Java:
 BufferedReader fileIn = new BufferedReader(new FileReader(file));
               
        int t = 0;
        while (fileIn.readLine() != null) {
            // count lines from the file
          t = t+1;
           }
        
        fileIn.close();
        int k = t;    
        outgoing.write(k); // for printing on client side for (int t = 0; t<flength;t ++) ...
                
        BufferedReader fileInn = new BufferedReader(new FileReader(file));       
        for (int i = 0; i<=k;i++) {
            // send lines from the file to the client
           String line = fileInn.readLine();
           outgoing.println(line);
           }


Also vielen Dank für die Hilfe.

Gruß Zack
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
L file upload / download über http Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
D CSV File Upload Netzwerkprogrammierung 5
D Socket Gute Idee?: File als byte[] per ObjectIOStream übertragen Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
H Applet soll XML-File auf Server speichern Netzwerkprogrammierung 6
R Apache HttpClient File Download? Netzwerkprogrammierung 3
0 Apache Commons File Object bekommen Netzwerkprogrammierung 4
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
M HTTP File Upload mit Prozessbar Funktioniert nicht. Netzwerkprogrammierung 8
5 File Upload/ ClassNotFoundException Netzwerkprogrammierung 9
S RSS-Feed aus ini File Netzwerkprogrammierung 4
F Protokoll file:/// Netzwerkprogrammierung 2
B JNLP File -> Web Application Netzwerkprogrammierung 10
R HTTP HttpURLConnection Large File Upload Netzwerkprogrammierung 1
DStrohma RMI Security Manager & Policy-File Netzwerkprogrammierung 8
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
P java file.exists() zuzerstörbar Netzwerkprogrammierung 7
E java.net.SocketException: Unexpected end of file from server Netzwerkprogrammierung 2
G SMB-File ausführen Netzwerkprogrammierung 15
J Problem beim Senden von File Netzwerkprogrammierung 4
J Mit der File Api Dateien von anderen Rechnern lesen ? Netzwerkprogrammierung 3
I unc pfad für die klasse file? Netzwerkprogrammierung 4
V file transfer problem Netzwerkprogrammierung 2
E upload progress bei einem http file post Netzwerkprogrammierung 5
P File von http-Server kopieren Netzwerkprogrammierung 5
N File Transfer Netzwerkprogrammierung 5
D wie kann ich rmic ein .jar file übergeben? Netzwerkprogrammierung 3
R File chooser übers Netzwerk Netzwerkprogrammierung 3
J File upload mit ftp Netzwerkprogrammierung 4
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4
T file auf einen server laden Netzwerkprogrammierung 4
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28

Ähnliche Java Themen

Neue Themen


Oben