Hi,
Ich sitze an einem Client-Server Programm, bei dem der Client dem Server eine Datei schicken soll. Hier erstmal testweise ohne GUI, alles geschieht direkt automatisch. Es wird die file.txt auf der Clientseite eingelesen und geschickt.
Das Problem ist, dass im Serverordner zwar dann eine file.txt erstellt wird, diese aber leer ist…
Ich habe das ganze hier bereits auf der Serverseite als “Multi”-Threaded (Multi in “”, weil bisher ja nur 1 Thread erstellt wird) aufgebaut, da ja später dann wenn es funktioniert auch mehrere Dateien gesendet werden sollen.
Das ganze funktioniert aber, sobald ich in Controller.java auf der Clientseite die zeile socket.close();
rausnehme…Aber das kann ja nicht die Lösung sein, denn socket
muss ja schließbar sein.
Daraufhin habe ich versucht (in der Controller.java)
bos.flush();
bos.close();
is.close();
socket.close();
durch
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
socket.close();
zu ersetzen, aber dann wird wieder keine Datei mit Inhalt empfangen…
Hier mal der Code:
Client:
package controller;
public class Main {
public static void main(String[] args) {
new Controller();
}
}
package controller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Controller {
public Controller() {
try {
sendeDateiZumServer();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendeDateiZumServer() throws UnknownHostException, IOException {
Socket socket = null;
String host = "localhost";
socket = new Socket(host, 5555); // Verbinde zum Server "localhost:5555"
String dateiname = "file.txt";
File file = new File(dateiname); // liest Datei mit diesem Namen ein, falls nicht existent, wird diese erstellt (was hier sinnfrei waere)
//Dateinamen zum Server schicken
OutputStream outText = socket.getOutputStream();
PrintStream outTextP = new PrintStream(outText);
outTextP.println(dateiname);
// Dateigroeße ermitteln (in Bytes)
long dateigroeße = file.length();
if (dateigroeße > Long.MAX_VALUE) {
System.out.println("Dateigröße ist zu groß!"); // sollte eigentlich hier nicht passieren
}else
System.out.println("Dateigröße: " + dateigroeße);
byte[] bytes = new byte[(int) dateigroeße]; // Erstelle ein byte-Array mit der Groeße der Dateigroeße
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis); // Verkette die eingelesene Datei mit diesem Inputstream
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
int count;
System.out.println("Fange an zu senden:....");
while ((count = bis.read(bytes)) > 0) { // Wird nur 1x durchlaufen!
System.out.println("count: " + count);
out.write(bytes, 0, count);
}
System.out.println("Fertig gesendet!");
out.flush();
out.close();
fis.close();
bis.close();
socket.close();
}
}
Server:
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
new Server();
}
}
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
new Server();
}
}
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client implements Runnable{
private Socket socket;
public Client(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
test();
}
private void test() {
try {
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
int bufferSize = 0;
InputStream outText = socket.getInputStream(); // Hier kommt das an, was der Client sendet
//Dateinamen empfangen
InputStreamReader outTextI = new InputStreamReader(outText);
BufferedReader inTextB = new BufferedReader(outTextI);
String dateiname = inTextB.readLine();
System.out.println("Dateiname: " + dateiname);
try {
is = socket.getInputStream(); // Ist das nicht gleich outText ?
bufferSize = socket.getReceiveBufferSize();
System.out.println("Buffer size: " + bufferSize);
} catch (IOException ex) {
System.out.println("Can't get socket input stream. ");
}
try {
fos = new FileOutputStream(dateiname);
bos = new BufferedOutputStream(fos); // Dieser Stream schreibt weiter unten dann die empfangene Datei
} catch (FileNotFoundException ex) {
System.out.println("File not found.");
}
byte[] bytes = new byte[bufferSize];
int count;
int testcount = 0;
while ((count = is.read(bytes)) > 0) { // liest hier die Datei, die empfangen wird (wird mehrmals durchlaufen!)
bos.write(bytes, 0, count); // Schreibt hier die empfangene Datei auf den Server
testcount++;
System.out.println("testcount: " + testcount); // wird niemals ausgegeben -> betritt niemals diese schleife
}
bos.flush();
bos.close();
is.close();
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}