Problembeschreibung:
- Fall: Der Server schickt an den Client eine Bilddatei, der Client empfängt die Datei und speichert sie ab (Funktioniert)
- Fall: Der Server schickt an den Client ein Objekt der Klasse DataInfo, der Client empfängt das Objekt und gibt den Inhalt
eines Attributs auf der Konsole aus (Funktioniert) - Fall: Der Server schickt zuerst ein Objekt der Klasse DataInfo und anschließend eine Bilddatei an den Client, der Client empfängt
das Objekt und gibt den Inhalt eines Attributs auf der Konsole aus (Funktioniert) anschließend empfängt der Client noch das Bild und
speichert es ab (Funktioniert nicht).
Beim Client ist zwar dieselbe Anzahl an Bytes angekommen, wie vom Server verschickt wurden, aber wenn ich versuche das Bild
anschließend zu öffnen dann wird mir gesagt das Bild kann nicht geöffnet werden, da es möglicherweise beschädigt wurde.
Das angekommene Bild ist aber genauso groß wie das vom Server versendete. Wieso wird mir hierbei das Bild also nicht angzeigt?
Der 3. Fall ist ja einfach nur eine Kombination aus dem 1. Fall und dem 2. Fall. Die ersten beiden Fälle funktionieren ja. Was muss
ich am 3. Fall ändern, damit er auch funktioniert?
Code 1. Fall
[spoiler]
#################################### 1. Fall #######################################################
Server Code - Server verschickt eine Bild Datei an den Client (Funktioniert)
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ServerNetworkPicPC");
new MyServerThread().start();
}
}
public class MyServerThread extends Thread
{
private int port;
private String filename = "C:/Users/pj2/Documents/Tulips.png";
public MyServerThread()
{
this.port = 1024;
}
public void run()
{
try
{
ServerSocket serverSocket = new ServerSocket(this.port);
OutputStream outputStream;
while(true)
{
Socket clientSocket = serverSocket.accept();
clientSocket.setKeepAlive(true);
clientSocket.setSoTimeout(0);
outputStream = clientSocket.getOutputStream();
File file = new File(filename);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[16*1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, len);
System.out.println(len);
}
outputStream.flush();
System.out.println("nach WHILE");
fileInputStream.close();
outputStream.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Client Code - Client erhält eine Bild Datei vom Server (Funktioniert)
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ClientNetworkPicPC Version 1");
new MyClientThread().start();
}
}
public class MyClientThread extends Thread
{
private String ip;
private int port;
private String filename;
public MyClientThread()
{
this.ip = "131.234.70.81";
this.port = 1024;
this.filename = "C:/Users/pj2/Documents/test.png";
}
public void run()
{
try
{
Socket socket = new Socket(this.ip, this.port);
socket.setKeepAlive(true);
socket.setSoTimeout(0);
File file = new File(this.filename);
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[16*1024];
int len = 0;
while ((len = inputStream.read(buffer)) > 0)
{
fileOutputStream.write(buffer, 0, len);
System.out.println(len);
}
System.out.println("nach WHILE");
fileOutputStream.flush();
fileOutputStream.close();
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
[/spoiler]
Code 2. Fall
[spoiler]
######################## 2. Fall #########################################
Server Code - Server verschickt ein Objekt der Klasse DataInfo an den Client (Funktioniert)
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ServerNetworkPicPC");
new MyServerThread().start();
}
}
public class MyServerThread extends Thread
{
private int port;
private String filename = "C:/Users/pj2/Documents/Tulips.png";
public MyServerThread()
{
this.port = 1024;
}
public void run()
{
try
{
ServerSocket serverSocket = new ServerSocket(this.port);
serverSocket.setSoTimeout(0);
OutputStream outputStream;
ObjectOutputStream objectOutputStream;
while(true)
{
Socket clientSocket = serverSocket.accept();
clientSocket.setKeepAlive(true);
clientSocket.setSoTimeout(0);
outputStream = clientSocket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
File file = new File(filename);
DataInfo dataInfo = new DataInfo(file.length());
objectOutputStream.writeObject(dataInfo);
objectOutputStream.reset();
System.out.println("DataInfo Objekt versendet");
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Client Code -Client erhält ein Objekt der Klasse DataInfo vom Server (Funktioniert)
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ClientNetworkPicPC Version 1");
MyClientThread myClientThread = new MyClientThread();
myClientThread.start();
}
}
public class MyClientThread extends Thread
{
private String ip;
private int port;
private String filename;
public MyClientThread()
{
this.ip = "131.234.70.81";
this.port = 1024;
this.filename = "C:/Users/pj2/Documents/test.png";
}
public void run()
{
try
{
Socket socket = new Socket(this.ip, this.port);
socket.setKeepAlive(true);
socket.setSoTimeout(0);
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
if(object instanceof DataInfo)
{
DataInfo dataInfo = (DataInfo) object;
long dataSize = dataInfo.getDataSize();
System.out.println("dataSize: " + dataSize);
}
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
[/spoiler]
Code 3. Fall
[spoiler]
################################### 3. Fall ###########################################################
Server Code - Server verschickt zuerst ein Objekt der Klasse DataInfo und anschließend eine Bild Datei an den Client (Funktioniert nicht).
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ServerNetworkPicPC");
new MyServerThread().start();
}
}
public class MyServerThread extends Thread
{
private int port;
private String filename = "C:/Users/pj2/Documents/Tulips.png";
public MyServerThread()
{
this.port = 1024;
}
public void run()
{
try
{
ServerSocket serverSocket = new ServerSocket(this.port);
OutputStream outputStream;
ObjectOutputStream objectOutputStream;
while(true)
{
Socket clientSocket = serverSocket.accept();
clientSocket.setKeepAlive(true);
clientSocket.setSoTimeout(0);
outputStream = clientSocket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
File file = new File(filename);
FileInputStream fileInputStream = new FileInputStream(file);
DataInfo dataInfo = new DataInfo(file.length());
objectOutputStream.writeObject(dataInfo);
objectOutputStream.reset();
objectOutputStream.flush();
System.out.println("DataInfo Objekt versendet");
byte[] buffer = new byte[16*1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, len);
System.out.println(len);
}
outputStream.flush();
System.out.println("nach WHILE");
fileInputStream.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Client Code - Client erhält zuerst ein Objekt der Klasse DataInfo und anschließend eine Bild Datei vom Server (Funktioniert nicht)
public class MyMain
{
public static void main(String[] args)
{
System.out.println("ClientNetworkPicPC Version 1");
new MyClientThread().start();
}
}
public class MyClientThread extends Thread
{
private String ip;
private int port;
private String filename;
public MyClientThread()
{
this.ip = "131.234.70.81";
this.port = 1024;
this.filename = "C:/Users/pj2/Documents/test.png";
}
public void run()
{
try
{
Socket socket = new Socket(this.ip, this.port);
socket.setKeepAlive(true);
socket.setSoTimeout(0);
File file = new File(this.filename);
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
if(object instanceof DataInfo)
{
DataInfo dataInfo = (DataInfo) object;
long dataSize = dataInfo.getDataSize();
System.out.println("dataSize: " + dataSize);
}
byte[] buffer = new byte[16*1024];
int len = 0;
while ((len = inputStream.read(buffer)) > 0)
{
fileOutputStream.write(buffer, 0, len);
System.out.println(len);
}
System.out.println("nach WHILE");
fileOutputStream.flush();
fileOutputStream.close();
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
############################ Versendetes Objekt ###############################################################
public class DataInfo implements Serializable
{
private static final long serialVersionUID = 4893811447239313830L;
private long dataSize;
public DataInfo()
{
}
public DataInfo(long dataSize)
{
this.dataSize = dataSize;
}
public void setDataSize(long dataSize)
{
this.dataSize = dataSize;
}
public long getDataSize()
{
return this.dataSize;
}
}
[/spoiler]