# Dateien über TCP/IP senden



## mukkerson (24. Mrz 2009)

Hallo liebe java community,

ich arbeite gerade an einem Projekt, wo über eine GUI mehere .xml Dateien versenden soll. Meine GUI ist schon so halbwegs am laufen, jedoch sieht diese noch nicht Optimal aus, aber das werde ich anschließend beheben.
Ich will ich nur kurz noch erklären wie diese GUI funktioniert: 
man hat 2 Buttons "Auswählen" und Auswählen 2". Bei dem "Auswählen" Button kann man nur einen Dateinamen in eine TextArea schreiben. "Auswählen 2" hat eine JList, die mehrere Dateinamen einträgt.
Nun ist mein Ziel den Inhalt der Dateinamen über TCP zu versenden. Fürs erste Habe ich das HyperTerminal genommen, welche eine TCP/IP Verbindung über einen Port herstellen kann. Meine eigentlich Frage ist jetzt wie soll ich jetzt anfangen und wo vor allem ich wurde nicht schlauer aus meinem JAVA-Buch...  ich sitze hier schon seit 3 
Tagen an dem selben Problem langsam werde ich depri ... 

Ich poste euch mal meinen Quellcode:

[HIGHLIGHT="Java"]import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileView;
import javax.swing.text.JTextComponent;

public class TVorklassifikator extends JFrame implements ActionListener
{


	private JList nameList;
	private DefaultListModel nameListModel;
	//private Vector<String> nameListModel;
	private JTextComponent file1;

	public TVorklassifikator()
	{
		super("TVorklassifikator");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		GridBagConstraints constraints = new GridBagConstraints();
		setLayout(new GridBagLayout());

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 2;
		constraints.insets = new Insets(0, 2, 0, 2);
		Label header = new Label("TVorklassifikator");

		header.setFont(new Font("Arial",Font.BOLD, 16));
		add(header, constraints);

		constraints.gridheight = 4;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.anchor = GridBagConstraints.WEST;
		constraints.insets = new Insets(5, 5, 5, 5);
		JButton choose1 = new JButton("Auswählen");
		choose1.addActionListener(this);
		add(choose1, constraints);

		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.WEST;
		constraints.insets = new Insets(5, 5, 5, 5);
		JLabel labelFile = new JLabel("Datei 1:");
		add(labelFile, constraints);


	    constraints.gridheight = 8;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.insets = new Insets(5, 5, 5, 5);
		file1 = new JTextField("                   ");
		add(file1, constraints);

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 4;
		constraints.insets = new Insets(5, 5, 5, 5);
		constraints.anchor = GridBagConstraints.WEST;
		JButton choose2 = new JButton("Auswählen 2");
		choose2.addActionListener(this);
		add(choose2, constraints);

		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.WEST;
		JLabel labelFile2 = new JLabel("Datei 2:");
		add(labelFile2, constraints);

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.WEST;
		nameListModel = new DefaultListModel();
		nameList = new JList(nameListModel);
		//nameListModel = new Vector<String>();
		JScrollPane fileName = new JScrollPane(nameList);
		add(fileName, constraints);

		constraints.gridwidth = GridBagConstraints.RELATIVE;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.WEST;
		constraints.insets = new Insets(5,5,5,5);
		JButton deleteAll = new JButton("Alle Einträge entfernen");
		deleteAll.addActionListener(this);
		add(deleteAll,constraints);

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.EAST;
		constraints.insets = new Insets(5,5,5,5);
		JButton delete = new JButton("Eintrag entfernen");
		delete.addActionListener(this);
		add(delete,constraints);

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.EAST;
		constraints.insets = new Insets(20, 30, 20, 30);
		JButton end = new JButton("Ende");
		end.addActionListener(this);
		add(end, constraints);

		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.gridheight = 4;
		constraints.anchor = GridBagConstraints.EAST;
		constraints.insets = new Insets(20, 30, 20, 30);
		JButton send = new JButton("Senden");
		send.addActionListener(this);
		add(send, constraints);



		setSize(700, 650);
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		String cmd = e.getActionCommand();

		System.out.println("cmd: " + cmd);

		if(cmd.equals("Auswählen"))
		{
			JFileChooser fc = new JFileChooser();
			fc.setCurrentDirectory(new File("."));
			fc.setFileFilter(new MyFileFilter());
			if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
			{
				File f = fc.getSelectedFile();

				file1.setText(f.getName());

			}
		}
		if(cmd.equals("Auswählen 2"))
		{
			JFileChooser fc = new JFileChooser();
			fc.setCurrentDirectory(new File("."));
			fc.setFileFilter(new MyFileFilter());
			if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
			{
				File f2 = fc.getSelectedFile();

				nameListModel.addElement(f2.getName());
//				nameListModel.add(f2.getName());
//				nameList.setListData(nameListModel);

			}
		}

		if(cmd.equals("Ende"))
		{
			int n = JOptionPane.showConfirmDialog(
					this, "Anwedung wirklich beenden?", "Ende",
					JOptionPane.YES_NO_OPTION,
					JOptionPane.QUESTION_MESSAGE);
			if(n == JOptionPane.YES_OPTION)
				System.exit(0);
		}
		if(cmd.equals("Alle Einträge entfernen"))
		{

			nameList.setModel(nameListModel);
			nameListModel.removeAllElements();

		}
		if(cmd.equals("Eintrag entfernen"))
		{
			int[] indices = nameList.getSelectedIndices();
			for(int i = indices.length - 1; i >= 0; i--)
			{
				nameListModel.removeElementAt(indices_);
			}
		}
	}
	public class MyFileFilter extends FileFilter
	{
		public boolean accept(File file)
		{ 
			if(file.isDirectory())
				return true;
			String name = file.getName();

			if(name.endsWith(".xml"))
				return true; 
			else
				return false;
		}

		public String getDescription()
		{
			return "Text file(*.xml)";
		}
	}

	public static void main(String[] args)
	{
		new TVorklassifikator();
	}
}
[/HIGHLIGHT]


Ich bedanke mich schonmal bei euch im voraus _


----------



## tuxedo (24. Mrz 2009)

>> Meine eigentlich Frage ist jetzt wie soll ich jetzt anfangen

Wie wär's mit in der Java API Doc mal nach "Socket" und "SocketServer" zu schauen. Gleich danach noch diverse Input und OutputStreams unter die Lupe nehmen.

Es schadet auch nicht Google mal nach "java socket dateitransfer" zu befragen.

Wenn du dann eine konkrete Frage oder ein Problem hast helf ich gerne weiter. 

Gruß
Alex

P.S. Kleiner Tipp: Der Google-Suchbefehl liefert im 2. Suchergebnislink ein Beispielcode den du mal unter die Lupe nehmen könntest.


----------



## mukkerson (26. Mrz 2009)

vielen dank der tipp hat mich ziemlich weitergebracht. nun versteh ich aber noch nicht so genau, wie wie ich mehrere dateien aus der liste versende. soll ich da nun eine schleife verwenden oder wie soll das dann aussehen?


----------



## tuxedo (26. Mrz 2009)

Da wirst du ein "Protokoll" brauchen.

Ein Einfaches Protokoll sieht so aus:

4 bytes -> Integer -> Länge des Dateinamens
x bytes -> String -> Dateiname
4 bytes -> Integer -> Größe der Datei in bytes (Achtung: Dateien mit mehr als Integer.MAX_VALUE sind problematisch. Da am besten auf Long ausweichen :bae: )
x bytes -> viele bytes -> Datei selbst

Davon kannst du mehrere Blöcke schicken und an der Gegenüberliegenden Seite "auswerten".

DataInputStream und DataOutputStream sind die da behilflich. Vermeide auf jedenfall Printwriter und solche "Scherze" wenn du binäre Daten überträgst.

- Alex


----------



## mukkerson (31. Mrz 2009)

Hi,

das mit dem Protokoll verstehe ich noch nicht so ganz  
also ich weiß nicht genau, wie du das meinst und wie ich das ansatzweise anlege so ein protokoll.
ich entschuldige mich für meine unwissenheit, aber für mich ist das alles hier ein wenig neuland.

gruß mukkerson


----------



## dayaftereh (31. Mrz 2009)

Hey

Also das mit dem Protokoll ist so gemeint, Wenn du eine Datei über einen Socket Schickst weiß du ja nicht wie lang sie ist (Bytes) oder wenn du ersten den datei namen schicken willst, weiß der gegenüber ja nich wie viele bytes kommen. Des wegen eine Konzept zum schicken der Datein (Protokol) .

Ich würde es so machen.

x Bytes -> DateiNamen
0 Byte -> ende des Namens
4 Bytes - Integer -> Länge der Datei (vieliecht auch 8 bytes Long für große Datein)
x Bytes -> Die Datei

und dan die nägste Datei^^

vieliecht hilft es


----------



## mukkerson (1. Apr 2009)

hi ,
wie soll ich denn damit genau anfangen, weil ich weiß ehrlich gesagt gar nicht wie ich das syntaktisch jetzt aufbaue. In meinem JAVA-Buch ist das thema socket und server ganz knapp nur angeschnitten und ich weiß nicht wie ich jetzt genau anfange.


----------



## Ebenius (1. Apr 2009)

Zum Anfang könnte dieses Tutorial vielleicht hilfreich sein: Sockets programming in Java: A tutorial - JavaWorld

Ebenius


----------



## mukkerson (1. Apr 2009)

also ich wurde aus dem tutorial ein wenig schlauer, aber ich weiß immer nocht nicht genau, wie ich anfangen soll  bin ich blöd ?


----------



## dayaftereh (1. Apr 2009)

Ich denke mal die erste Überlegung ist, welches Grundprotokol verwendest du: TCP/IP oder UDP. ich würde dir raten TCP/IP zu nehmen.

Hier mal eine Kleines Tut... wie man zwei zahlen verschickt.
Michael Peuss - Socket-Programmierung in Java

Bei TCP/IP brauchst du eine Server der auf die Verbindung wartet also einen ServerSocket hat. bei dem Client brauhcst du nur eine Socket. So dan baut der Client die Verbindung zum Server auf, der Server schickt dem Client die daten und schlißt dan den Socket wieder.

So würde ich es machen! Wenn du nicht weiter kommst scheibe ich dir gerne mal ein Beispiel.


----------



## mukkerson (1. Apr 2009)

jaa das verstehe ich ja soweit und kann alles nachvollziehen, aber sobald ich dann auf mehere dateien zugreifen möchte und die an das Hyperterminal senden will scheitere ich an der umsetzung.
also ich habe mir gedacht, dass ich die dateien über die while-schleife einzeln rüberschicke.
eine xml-datei habe ich ja bereits verschickt, aber ich will halt mehrere rüberschicken und die muss ich ja vorher erstmal einlesen und dann den inhalt an das hyperterminal versenden.

[HIGHLIGHT="Java"]public void sendFiles(Socket servsock) throws IOException 
	{
	File file = new File("C:\\Dokumente und Einstellungen\\Benutzer\\workspace\\TVorklassifikator");


		BufferedReader r = new BufferedReader(
				new FileReader("TestDFJob.xml"));
			PrintWriter w = new PrintWriter(servsock.getOutputStream());
			String line;


			while ((line = r.readLine()) != null)
			{
				w.println(line);
			}
			w.flush();

			servsock.close();






	}[/HIGHLIGHT]
ich verschicke ja im moment nur eine datei und die gebe ich auch direkt an ( also den namen der xml-datei)
ist die umsetzung bei dem tutorial mit den zahlen genauso möglich mit dateien?


----------



## dayaftereh (1. Apr 2009)

Also erstmal, brauchst du ja eine liste mit den Datei, ich meine damit alle Pfade zu den datein. Dann liest du stück für stück alle Datein byte weiße ein und veschiebst sie zu gleich über den Socket. Naturlich wenn du mehere verschicken willst musst du dir noch einen Platzhalter bauen um zu wießen wann die erste fertig ist^^

Also morge mache ich mal ein Beispiel^^


----------



## mukkerson (2. Apr 2009)

jaa vielen dank  bin schon gespannt 
gruß mukkerson


----------



## FArt (2. Apr 2009)

Das Rad existiert bereits und runder wird es nicht mehr.
Warum plain TCP/IP? Es gibt fertige Protokolle und APIs, die für eine Dateitransfer besser geeignet sind... FTP, SCP, ...
Tipp: Apache FtpServer - Index


----------



## mukkerson (2. Apr 2009)

ja aber ich mache das hier zu übungszwecken, um ein wenig mehr plan zu bekommen.


----------



## dayaftereh (2. Apr 2009)

Ok, also ich habe dir jetzt ein funktioniren Beispiel gemacht. Hoffe du kannst das zu Übungs zwecken benutzen. Der Code ist nicht würglich sauber, aber hoffe lesbar. Bitte beachte nicht die ganzen Rechtscheibfehler. 

Ich habe es so aufgebaut. Dem Server gibst du eine Port (Der Server Port) und eine Pfad zu einem Ordner mit(Ordener mit den zu verschickenen datein) als Start Parameters. Der Server wartet dan auf Verbindungen. Er kann auch mehere Clients gleichzeitig bedienen.(Muti-Threading).

Dem Client gibtst du als Start Paramter Port des Server,Ip des Servers und eine Ordner wo er die ankommenden Datein ablegen soll^^ Ich habe das In Eclipse gemacht, wenn du willst kann ich dir auch das Projekt exportiren.

Also Hier erstmal den Server:

Server.java

```
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable {

	private boolean started = true;

	private int port = 0;

	private File folderPath = null;

	private ServerSocket serverSocket = null;

	public Server(int port, File folderPath) {
		this.port = port;
		this.folderPath = folderPath;
	}

	public void run() {
		System.out.println("Send Folder: " + folderPath.getAbsolutePath());

		try {
			/* Erzeugt den ServerSocket */
			serverSocket = new ServerSocket(port);
			while (started) {

				/* Wartet auf eigehenede Verbindungen */
				Socket s = serverSocket.accept();

				/* Erzugt eine neue ServerSession */
				newSession(s);

				/* Lest den Thread kurz Schlafen */
				sleep(10);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private void newSession(Socket s) {

		System.out.println("new Session for " + s.getInetAddress().getHostAddress());

		/* Erzugt die neue ServerSession mit dem Socket und den Path zum Folder */
		ServerSession session = new ServerSession(s, folderPath);

		/* Startet den Thread */
		Thread t = new Thread(session);
		t.start();
	}

	private void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		/* Prüfe args auf die Wichtigen Info */

		if (args.length != 2) {
			System.out.println("Usage: PORT FILE_FOLDER");
			return;
		}

		/* Holde sich den Port */
		int port = Integer.parseInt(args[0].trim());

		/* Prüft ihn */
		if (port <= 0) {
			System.err.println("Unkown Port!");
		}

		/* Hold sich den Pfad zum Folder mit den Zu sendenen Datein */
		File f = new File(args[1].trim());

		/* Prüft ob der Ordner existirt */
		if (f == null || f.exists() == false || f.canRead() == false) {
			System.err.println("Can't find File Folder:" + f.getAbsoluteFile());
			return;
		}

		/* Erzugt den Server mit Port und den Folder */
		Server server = new Server(port, f);

		/* Starte den ServerThread um auf dem Port zu hören */
		Thread t = new Thread(server);
		t.start();

		System.out.println("Listening on " + port);

	}

}
```

Jetzt noch die ServerSession.java

```
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class ServerSession implements Runnable {

	private Socket s = null;
	private File folderPath = null;

	private DataOutputStream out = null;
	private DataInputStream in = null;

	public ServerSession(Socket s, File folderPath) {
		this.s = s;
		this.folderPath = folderPath;
	}

	/**
	 * Öffnet die Beiden Streams
	 */
	private void openStream() {
		try {
			if (out == null) {
				/* new DataOutputStream */
				out = new DataOutputStream(s.getOutputStream());
			}
			if (in == null) {
				/* new DataInputStream */
				in = new DataInputStream(s.getInputStream());
			}
		} catch (IOException e) {
			e.printStackTrace();
			/* Wenn fehler dan Disconnected */
			disconnect();
		}
	}

	public void run() {

		/* Öffnet jetzt die Streams zum lesen & Schrieben */
		openStream();

		/* Hold sich alle Files aus dem Folder */
		File[] files = folderPath.listFiles();

		/* Durchleuft die File Liste */
		for (File file : files) {
			try {
				/* Sende Jedes File */
				sendFile(file);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		/* Schlißt dan die Verbindung */
		disconnect();

	}

	/**
	 * Zum Schicke einer Datei uber den Socket
	 * 
	 * @param f
	 *            - Die Datei als {@link File}
	 * @throws IOException
	 */
	private void sendFile(File f) throws IOException {
		/* Prüft ob es diese Datei gibt */
		if (f == null || f.exists() == false || f.canRead() == false) {
			System.err.println("Can't find File: " + f.getAbsolutePath());
			return;
		}

		/* Hold sich die länge der Datei in Bytes */
		long length = f.length();

		/* Scheibt nun den File Name raus */
		out.writeBytes(f.getName());
		/* Null Byte um zusagen das der Filename zu ende ist */
		out.write(0);
		/* Scheibt die länge der Datei raus */
		out.writeLong(length);

		/* Hold sich die Datei als Stream */
		FileInputStream in = new FileInputStream(f);

		int i = 0;

		/* Scheibt byte für byte die Datei raus */
		while ((i = in.read()) != -1) {
			out.write(i);
		}

		/* Schlißt den Datei Stream */
		in.close();

	}

	/**
	 * Räumt einfach nur auf und schließ alle Verbindungen
	 */
	public void disconnect() {

		System.out.println(s.getInetAddress().getHostAddress() + " Disconnect!");

		try {
			if (out != null) {
				out.close();
			}
			if (in != null) {
				in.close();
			}
			if (s != null) {
				s.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

So jetzt noch der Client.java


```
import java.io.File;
import java.io.IOException;
import java.net.Socket;

public class Client {

	private int port = 0;
	private String ip = null;
	private File saveFolder = null;

	public Client(int port, String ip, File saveFolder) {
		this.ip = ip;
		this.port = port;
		this.saveFolder = saveFolder;
	}

	/**
	 * Fürt die Verbindung zum Server durch
	 */
	public void connect() {
		System.out.println("Recevi Folder: " + saveFolder.getAbsolutePath());

		try {
			/* Erzugt den Socket zum Server */
			Socket s = new Socket(ip, port);

			System.out.println("Connected to " + ip + " on " + port + "!");

			/* Erstellt die ClientSession um die Dateien an zu nehmen */
			ClientSession session = new ClientSession(s, saveFolder);

			/* Started den Thread */
			Thread t = new Thread(session);
			t.start();

			System.out.println("Session Started!");

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		/* Schaut ob alle args aa sind */
		if (args.length != 3) {
			System.out.println("Usage: IP PORT RECEIV_FOLDER");
			return;
		}

		/* Hold sich die IP-Adresse */
		String ip = args[0].trim();

		/* Prüft ob sie nicht null oder empty ist */
		if (ip == null || ip.equals("")) {
			System.err.println("Unkown IP.");
			return;
		}

		/* Hold sich den Port */
		int port = Integer.parseInt(args[1].trim());

		/* Prüft ob er nicht klein oder Gliche 0 ist */
		if (port <= 0) {
			System.err.println("Unkown Port.");
			return;
		}

		/* Hold sich den Folder wo die Dateien gespeicher Werden */
		File saveFolder = new File(args[2].trim());

		/* Prüf ob dieser existir und man auf ihn schieben kann */
		if (saveFolder == null || saveFolder.exists() == false || !saveFolder.canWrite()) {
			System.err.println("Can't finde Receiv Folder");
			return;
		}

		/* Erzugt eine Klient um sich dan mit dem Server zu verbinden */
		Client client = new Client(port, ip, saveFolder);

		/* Führt die Verbindung zum Server aus */
		client.connect();

	}

}
```

und noch die ClientSession.java


```
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ClientSession implements Runnable {

	private boolean started = true;

	private File saveFolder = null;

	private DataOutputStream out = null;
	private DataInputStream in = null;

	private Socket s = null;

	public ClientSession(Socket s, File saveFolder) {
		this.s = s;
		this.saveFolder = saveFolder;
	}

	/**
	 * Öffnet die Beiden Streams
	 */
	private void openStream() {
		try {
			if (out == null) {
				out = new DataOutputStream(s.getOutputStream());
			}
			if (in == null) {
				in = new DataInputStream(s.getInputStream());
			}
		} catch (IOException e) {
			e.printStackTrace();
			disconnect();
		}
	}

	public void run() {

		/* Öffnet jetzt die Streams zum lesen & Schrieben */
		openStream();

		/* Started die Schiefe zum einlesen der Datein */
		while (started) {

			try {
				/* List immer nur eine Datei ein */
				receivFile();
			} catch (IOException e) {
				e.printStackTrace();
				disconnect();
			}

			sleep(10);
		}
	}

	/**
	 * List immer nur eine vom {@link DataOutputStream}
	 * 
	 * @throws IOException
	 */
	private void receivFile() throws IOException {

		/* Erzeugt eine StringBuffer um den Datei namen zu lesen */
		StringBuffer sb = new StringBuffer();

		int i = 0;

		/* Liest byte weiße den Dateiname vom DataInputStream */
		while ((i = in.read()) > 0) {
			sb.append((char) i);
		}

		String fileName = sb.toString();

		/* Prüft ob der Dateiname nicht leer ist */
		if (fileName == null || fileName.equals("")) {
			throw new IOException("File Name is empty");
		}

		/* erzeugt erstmal den Pfad zu neuhen Datei */
		File f = new File(saveFolder.getPath() + "/" + fileName);

		/* Erstellt nun die neue datei */
		if (!f.createNewFile()) {
			throw new IOException("Can't create File: " + f.getAbsoluteFile());
		}

		/* List nun byte weiße die Länge der Datei ein */
		long length = in.readLong();

		/* Öffnent eine Stream zu neuen datei */
		FileOutputStream out = new FileOutputStream(f);

		long c = 0;

		/* List nun byte für byte vom DataInputStream in unser neue Datei */
		while (c < length) {
			out.write(in.read());
			c++;
		}

		/* Schlißt nun die neue Datei */
		out.close();

		System.out.println("Receiv File: " + f.getAbsoluteFile());
	}

	/**
	 * Räumt einfach nur auf und schließ alle Verbindungen
	 */
	public void disconnect() {
		started = false;
		try {
			if (out != null) {
				out.close();
			}
			if (in != null) {
				in.close();
			}
			if (s != null) {
				s.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
```

So wie gesagt, der Code ist nicht der Beste^^ Hoffe es Hilft dir


----------



## mukkerson (3. Apr 2009)

sauber ich hab alles hinbekommen, so wie ich es wollte  danke für das beispiel und den ganzen support einfach nur super wie schnell man hier lernen kann 
vielen dank und schöne grüße mukkerson
p.s. schönes wochenende


----------



## FArt (3. Apr 2009)

Ich finde es gut, dass dayaftereh hier so viel Vorarbeit geleistet hat, damit du aus Übungszwecken einen Dateitransfer verwenden kannst....aber was willst du üben?
Der Transfer an sich ist ja jetzt schon fertig. Der Code ist nicht besonders sauber, besonders im Umgang mit den Stream-Ressourcen. Das hat der Poster ja schon angemerkt, aber für dich scheint die Arbeit erledigt. denn du hast "... alles hinbekommen wie gewollt"... oder?
Mein Vorschlag: wenn üben, dann richtig.

just my 2 cents...


----------



## Daniel.Deng (13. Apr 2009)

Ich würde dir vorschlagen, ein Framework zu nehmen. Es gibt sehr leichte Framework für Socketkommunikation z.B. Quickserver (siehe Quickstart bei .:: QuickServer ::. QuickStart), oder Apache MINA. Sie unterstüzt die Transportierung von einem allgemeinem Object und daraus kannst du zu deinem eignem Class (oder bei dir wahrscheinlich ArrayList) konvertieren.

Es gibt noch anderen wie Cindy, Netty usw.

Wenn du nicht genügent Zeit um Socketprogramierung zu lernen hast, kannst du direkt die nehmen. Ich würde davon Quickserver und MINA empfehlen.

Wir haben schon mehrere Projekt damit gemacht, und man braucht fast nur auf Business Logic zu konzentrieren. 
Viel Erfolg!


----------

