Probleme beim weiter senden von Datein

Status
Nicht offen für weitere Antworten.

Planetasia

Mitglied
Hallo,

ich versuche gerade "einfach" ein txt-File von einem Client zu einem anderen Client zu senden. Das senden vom Client zum Server funktioniert soweit, aber sobald ich die datei weiter senden will, wird die connection jedes mal getrennt! Kann mir jemand sagen was da falsch ist?

Server:
Java:
// Nachricht empfangen und....
byte data[] = new byte[1024];

InputStream is = clientSocket.getInputStream();
FileOutputStream file = new FileOutputStream("C:\\testJava.txt");

// Datei zwischen speichern! 
int size;

while ((size = is.read(data)) != -1)
{
    file.write(data, 0, size);
    file.flush();
}

					
file.close(); 

// Datei weiter an den anderen Client senden:
int size; 
		File openfile= new File("C:\\testJava.txt");
		 try {
		OutputStream os= clientSocket.getOutputStream();
		FileInputStream file= new FileInputStream(openfile);
		  				
			byte data[] = new byte[1024];
			
			this.out.println("File");
			
			while((size=file.read(data))!= -1){
				os.write(data, 0, size);
				os.flush();
			}
		
			os.close();
			file.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Client senden: (File wird über FileChooser ausgewählt!)
Java:
public void WriteMesssage(File f){
		
		out.println("File");
		out.flush();
		
		 File myFile = f;
		 int size;
		 byte data[]= new byte[1024];
	    try {
			OutputStream os= mClient.getOutputStream();
			
			FileInputStream file= new FileInputStream(myFile);
			
			while((size=file.read(data))!=-1){
				os.write(data, 0, size);
				os.flush();
			}
			os.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Client empfangen des Files --> gleich wie beim Server!


lg
 

Paddelpirat

Bekanntes Mitglied
Hi,

habe zwar gerade keine Zeit deinen Code auszuprobieren, aber spontan würde ich sagen, dass der Schreibvorgang fehl schlägt, da du den InputStream nicht mit is.close() beendet hast und somit der Socket blockiert wird.
 

Planetasia

Mitglied
hm...

danke erstmal für deine Antwort. Leider hat das auch nicht geholfen.

Meine Fehlermeldung am Server:

Exception in thread "Thread-0" java.lang.NullPointerException
at Server.run(Server.java:91)
Zeile 91:

Java:
while!(line = in.readLine()).equalsIgnoreCase("/quit"){
// hier steht der Code zum Nachrichten bzw. Datein zum empfangen!!

und die Fehlermeldung am Client:

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Client.run(Client.java:138)

Java:
	while(!(line = in.readLine()).equals("/quit")){
    //selbe wie beim Server
   }

lg
 

Paddelpirat

Bekanntes Mitglied
Der Ausdruck line = in.readLine() wird null, falls du alle Daten vom Socket eingelesen hast. Änder die Abfrage mal in folgende Bedingungen ab:

Java:
while((line = in.readline()) != null && !line.equalsIgnoreCase("/quit")) {

Wenn line null sein sollte, also er nichts mehr zum einlesen hat wird die Schleife abgebrochen, ansonsten überprüft er noch, ob die eingelesene Zeile ungleich "/quit" ist.
 
Zuletzt bearbeitet:

Planetasia

Mitglied
hm...wenn ich auf != null abfrage, dann werde ich ja gleich disconnected.... weil ich schicke doch nicht
immer Nachrichten bzw. files! Oder hab ich das falsch verstanden!?

Wie kann ich das machen, dass mein Server auf Nachrichten und auf Files wartet!?
Auf Nachrichten warten und diese dann an die Clients weiter schicken funktioniert.
--> sobald ich auf !=null abprüfe, dann funktioniert gar nix mehr :-(
Der Client kann sich nicht mal auf dem Server anmelden!

lg
 

Paddelpirat

Bekanntes Mitglied
Dann am besten:

Java:
boolean isAlive=true;

while(isAlive) {
  line = in.readLine();
  if(line != null) {
    if(line.equalsIgnoreCase("\quit")) isAlive = false;
    else {
         //hier kommt dein übriger Code rein
    }
  }
}
 

Planetasia

Mitglied
hätte ich so auch schon versucht.
Allerdings wird auch dabei die Verbindung sofort getrennt...
ich schick dir mal den ganzen code.... vielleicht erwähne ich irgendetwas wichtiges nicht.....

Java:
import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;




public class Client extends Thread {
	private static HashMap<String, Client> clients = new HashMap<String, Client>();
	private Socket clientSocket;
	private BufferedReader in;
	private PrintWriter out;
	private String name;
	private ClientStatus status;
	MutableAttributeSet mAttributes;
	private boolean changeAttributes;
	
	//Zum Daten senden!!!
	private boolean mFile;
	private InputStream mGetFile;
	private ObjectInputStream mInStream;
	private ObjectOutputStream mOutStream;
	
	
	public Client(Socket s) {
		clientSocket = s;
		status = ClientStatus.CONNECTED;
		try {
			in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
			out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
			mOutStream=  new ObjectOutputStream(clientSocket.getOutputStream());
			mInStream = new ObjectInputStream(clientSocket.getInputStream());
			mAttributes=null;
			mAttributes= new SimpleAttributeSet();
			mFile=false;
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	public String getAddress() {
		return clientSocket.getInetAddress().getHostAddress();
	}
	public ClientStatus getStatus() {
		return this.status;
	}
	public void setStatus(ClientStatus s) {
		this.status = s;
	}
	
	public void setAttributes(MutableAttributeSet _attributes)
	{
		
			mAttributes= _attributes;
		
		
	}
	public MutableAttributeSet getAttributes()
	{
		return mAttributes;
	}
	
	@Override
	public void run() {
		try {
			String line;
			boolean sent=false;
			int x=0;
			while(!(line = in.readLine()).equalsIgnoreCase("/quit")) {
				sent=false; // After whispering....to send message to everybody again....

								
			//DATEN EMPFANGEN/SENDEN.......................
			
				if(line.equals("File")){	
					
					 
			        byte data[] = new byte[600000];

			        InputStream is = clientSocket.getInputStream();
			        FileOutputStream fileOut = new FileOutputStream("C:\\testJava.txt");

			        // Datei zwischen speichern! 
			        int size;
			        while ((size = is.read(data)) != -1)
			        {
			            fileOut.write(data, 0, size);
			            fileOut.flush();
			        }
			       
			        					
					fileOut.close();
					is.close();
					
									
					  System.out.println("Empfangen");
				   // sendFile();
				    out.println("ready");
				    mFile=true;
				    
				}
				
				/**
				 * Datei weiter schicken:
				 */
				if(line.equals("send")){
					System.out.println("los gehts....");
					sendFile();
					x=2;
				}
				
		

				if (this.status == ClientStatus.NAMED && !mFile) {
					
					if(line.equals("/show"))
					{
						int i=0;
						
						for(Client c: clients.values()){
							this.out.println(i+ ". Client = " + c.name);
							
							c.out.flush();
							sent=true;
							i++;
							
						}
					}
					if (line.charAt(0)=='/' && sent==false) {
						if (line.indexOf("/help")!=-1) {
							
						} 
						else {
							//whisper to a client
							int i=0;
							GregorianCalendar calender= new GregorianCalendar();
							DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
							df= DateFormat.getTimeInstance(DateFormat.SHORT);
							
							List<Character> charlist = new ArrayList<Character>(); // List for reading the name
							
													
							//holt sich alle chars vom namen (ohne "/")
							while(line.charAt(i)!=' '){ 
								
								if(line.charAt(i)!= '/'){
									charlist.add(line.charAt(i));	
								}
								
								i++;
							}
						
							int size=charlist.size(); // gets the size of the array for allocate the memory for the array
							
							
							char [] arr= new char[size]; // gets the name
							
							for(int j=0; j<size; j++)
							{
								arr[j]=charlist.get(j); //gets the single char of the List (name)
							}
							String _name= new String(arr); // new String with the name
							
							
							charlist.clear(); // delete the list
							
							int lenght= line.length()-size-2;
							char [] send_txt= new char[lenght];
							int cnt=0;
							//saves every char of the message
							for( i=size+2; i< line.length(); i++)
							{
							send_txt[cnt]=line.charAt(i);
								cnt++;
							}
						
							String help_txt= new String(send_txt); //save the list to an String
						
							 //is looking for the client to sent the message
							int xyz=0;
							for (Client c: clients.values())
							{
								
								if(c.name.compareTo(_name)==0)
								{
									c.out.println("[ "+df.format(calender.getTime())+"] "+ this.name+"(flüstert)> "+help_txt);
									c.out.flush();
									sent=true;
									xyz++;
								
								}
								
							}
							
							if(xyz==0){
								this.out.println(_name+ " befindet sich nicht im Chat");
							}
							
						
						}
					} 

					else {
						if(sent==false){
						// Send message to all NAMED users
						GregorianCalendar calender= new GregorianCalendar();
						DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
						df= DateFormat.getTimeInstance(DateFormat.SHORT);
						
						for (Client c : clients.values()) {
							if (!c.equals(this)) {
								c.out.println("[ "+df.format(calender.getTime())+"] "+ this.name+"> "+line);
								c.out.flush();
								
								System.out.println("Nachricht an: "+c.name+" lautet:" +line);
							}
						}
					}
				} 
					this.out.flush();
			}
				
				if(x==2){
					System.out.println("Ende....");
					mFile=false;
					this.out.println("ENDE");
				}
				
				else if(this.status == ClientStatus.CONNECTED) {
					if (line.indexOf("/name")!=-1) {
						if (line.length()<128) { 
							name = line.substring(6);
							clients.put(name, this);
							this.setStatus(ClientStatus.NAMED);
							System.out.println("Client provided name: "+name);
							System.out.println(clients.size()+ "named Clients connected");
						} else {
					System.out.println("Nickname too long, please provide a shorter name!");
						}
					} 
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			try {
				System.out.println("Client "+name+" disconnected");
				in.close();
				out.close();
				clientSocket.close();
				clients.remove(this);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public void sendFile(){
		int size; 
		File openfile= new File("C:\\testJava.txt");
		out.println("File");
		try {
		OutputStream os= clientSocket.getOutputStream();
		FileInputStream file= new FileInputStream(openfile);
		  				
			byte data[] = new byte[600000];
			
			this.out.println("File");
			
			while((size=file.read(data))!= -1){
				os.write(data, 0, size);
				os.flush();
			}
		
			os.close();
			file.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

vielen dank für deine bemühungen!!

lg
 
Zuletzt bearbeitet:

Paddelpirat

Bekanntes Mitglied
Hmm in Zeile 101 steht bei dir:

Java:
InputStream is = clientSocket.getInputStream();

das brauchst du nicht, da du den InputStream ja schon in dem Konstruktor definiert hast.

Außerdem ist das is.close() ein Problem... wenn du das in der while-Schleife aufrufst, ist es kein Wunder, dass in eine NullPointerException auftaucht, weil du in der while-Schleifen-Bedingung ja wieder auf deinen InputStream zugreifst... sorry das war in deinem ersten Post nicht so ersichtlich, deswegen hatte ich das als Lösung vorgeschlagen *wink*.

Am besten änder die Stellen nochmal ab und schreib, wodran er sich als nächstes aufhängt...
 

Planetasia

Mitglied
hab mich grad noch etwas damit herum gespielt.... sobald die datei angekommen ist empfängt der Server gar nix mehr (ab zeile 125).... nicht mal normale nachrichten..... der String "line" ist immer null!
hm...hat irgendjemand eine idee warum!??? bevor ich eine Datei sende kommt es auch nicht zu diesem Problem...


lg

edit:
@Paddelpirat
auch nachdem ich das "is" nich close!!

es kommt trotzdem ein null zurück!!
 
Zuletzt bearbeitet:

Paddelpirat

Bekanntes Mitglied
Ich hab mal eine kleine Logik-Frage zu deinem Programm, da ich ja jetzt nur den Client sehe. Normalerweise läuft das ja so ab, dass man den Server startet und dieser wartet auf einen Request von einem Client.

Nun startet man einen (oder mehrere) Client(s). Dieser öffnet nun eine Verbindung zu dem Server (das hast du wohl in irgendeiner anderen Klasse, tut hier aber auch nichts zur Sache). Aber nun müsste der Client einen Request an den Server schicken a la: "get file: filename", oder sowas in der Art.
Der Server empfängt dieses Request und Antwortet darauf: "hier hast du es: <datadatadata....>".

Nun ist das aber so, dass dein Client wohl nur gestartet wird und dann wartet, bis er eine Nachhricht vom Server bekommt. Aber woher weiß der Server, dass der Client was haben möchte?
 
Zuletzt bearbeitet:

Planetasia

Mitglied
Sorry.....das hab ich nicht ganz klar gemacht.....
Den Client den du da siehst ist nicht der eigentliche Client.... sondern das ist ein Serverseitiger Client, der die Nachrichten aller Clients empfängt.... dieser Client schickt die empfangenen Nachrichten an alle weitern Clients weiter...
Es ist so.... ich habe einen Client (Clientseitig) der über einen Filechooser ein File auswählen kann. Zu beginn wähle ich nur mal ein txt-File aus.... dann sendet der Client dem Server einen Text...."File", damit der Server weiß dass es sich um ein File handelt. Danach wird das File an den Server gesendet!

Nun will ich dass der Server das empfangen File, vom Client, an den Client wieder zurück sendet (um zu testen ob es funktioniert) später soll der Server das File natürlich an einen anderen Client weiter schicken!...

Das vom Server empfangene File finde ich auch auf meiner Festplatte.... also weiß ich das der Server das File zumindest empfängt. Der nächste Schritt wäre nun dass der Server das File wieder öffnet und dieses an den Client zurück sendet! Allerdings ist nun das problem dass irgendwie die ganze Verbindung dabei verlorern geht! Und ich keine Ahnung hab warun :-(

Um einfach zu testen hätte ich jetzt auch versucht direkt nach dem Speichern des Files (vom Server) eine Nachricht an den Client wieder zu senden.... allerdings wird nicht mal mehr diese Nachricht gesendet!


Bin schon am verzweifeln :-(

lg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6
M Probleme beim Abfangen von Streams Netzwerkprogrammierung 5
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
K Probleme bei HTML-Mail-Abruf mit IMAP bei 1und1 Netzwerkprogrammierung 2
L Socket SSLServer Probleme Netzwerkprogrammierung 0
H Probleme mit UDP Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
R Probleme mit JMS Netzwerkprogrammierung 1
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
M Probleme mit FTP Netzwerkprogrammierung 19
windl URLConnection unter 1.7 macht Probleme Netzwerkprogrammierung 14
Maxim6394 Probleme bei Messenger Netzwerkprogrammierung 16
I Socket UDP Hole Punching bereitet Probleme Netzwerkprogrammierung 14
S HTTP Probleme mit POST-Befehl Netzwerkprogrammierung 2
R FTPS - Probleme mit FTPSClient Netzwerkprogrammierung 2
S Probleme mit XMLEncoder/XMLDecoder Netzwerkprogrammierung 2
D Server - Client Probleme Netzwerkprogrammierung 9
Weiti HTTP Zertifikat-Probleme - InstallCert.java Netzwerkprogrammierung 2
M Socket Probleme mit einfacher Socketverbindung Netzwerkprogrammierung 3
H Probleme mit GUI (RMI) Netzwerkprogrammierung 6
T RMI Probleme mit RMI-Server Netzwerkprogrammierung 4
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
T FTP Probleme mit Passiv und Binary Mode Netzwerkprogrammierung 3
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
S Socket SocketServer und Client machen Probleme Netzwerkprogrammierung 6
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
F RMI probleme Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
E jPcap Probleme Netzwerkprogrammierung 3
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
T Probleme mit Jpcap Netzwerkprogrammierung 18
P Probleme mit OutputStream Netzwerkprogrammierung 7
B Probleme mit FTP verbindung Netzwerkprogrammierung 22
L Probleme bei Chatserver Netzwerkprogrammierung 6
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
G Probleme mit SecruityManager + RMI Netzwerkprogrammierung 10
derMartin Probleme mit NNTP Client Netzwerkprogrammierung 2
A Probleme mit Citrix Netzwerkprogrammierung 17
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
K RXTXcomm : Install - Probleme Netzwerkprogrammierung 7
R Probleme mit UDP Netzwerkprogrammierung 4
P Probleme bei Chat programm Netzwerkprogrammierung 2
I Probleme mit 'JSSE Samples' von Sun Netzwerkprogrammierung 5
E InetAddress Klasse-Probleme Netzwerkprogrammierung 4
M dateien übertragen, probleme mit versch. Strömen? Netzwerkprogrammierung 4
R Rechte Probleme bei Applets Netzwerkprogrammierung 16
D EA-Exception Network Adapter macht probleme Netzwerkprogrammierung 2
P Probleme mit Input- / Output-Streams Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
F WLAN Probleme (CLIENT-SERVER) Netzwerkprogrammierung 4
J Probleme mit ObjectOutputStream! Netzwerkprogrammierung 15
G Fragen/Probleme mit JavaMail Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
C Probleme bei Dateiupload mit socket Netzwerkprogrammierung 4
T FTP Chatprogramm probleme Netzwerkprogrammierung 2
C RMI Probleme mit iptables Netzwerkprogrammierung 2
D socket exception + timing probleme Netzwerkprogrammierung 2
G Probleme bei Proxy-Server! Netzwerkprogrammierung 5
S Probleme mit HttpURLConnection Netzwerkprogrammierung 10
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
A sporadischer Fehler beim Schreiben auf NAS Netzwerkprogrammierung 2
A Automatisches Update beim Starten Netzwerkprogrammierung 1
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Nur die erste Nachricht kommt beim Server an Netzwerkprogrammierung 11
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
C ObjectInputReader wirft beim zweiten Aufruf eine Exception Netzwerkprogrammierung 3
Y RMI Initialisierung beim Server Netzwerkprogrammierung 10
B Socket Aufhängen beim Lesen Netzwerkprogrammierung 4
M Problem beim Datenempfang Netzwerkprogrammierung 2
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
M Authentifizierung beim Start von Java-Applets Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
G Kryptische Zeichen beim Auslesen einer Website Netzwerkprogrammierung 11
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben