# Array oder Object über Sockets



## JavaNeuling123 (6. Jan 2009)

Hallo,

ich möchte gerne das Array "pizzen" mittels Sockets  von einem Client an den Server übertragen(ohne RMI)!
Der Server soll dann die Inhalte auslesen, bearbeiten und die Inhalte wieder zurück schicken können.

Hätte das ganze mit ObjectOutputStream realisiert, aber irgendwie gibts folgende Fehlermeldung:

```
java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
```


Hier ein Ausschnitt des Codes:
Das Problem liegt in Zeile 16! Wie könnt ich ein Array sinnvoll über Sockets übertragen?


```
//Array Pizzen
Pizza []pizzen = {new Pizza(1, "Salami", 7),
				     new Pizza(2, "Schinken", 10)};

try
		{
			// Verbindung zum Server aufbauen
			Socket zumServer = new Socket(host, port);
			ObjectOutputStream oos = new ObjectOutputStream(zumServer.getOutputStream());			
			
			// Eingabestrom für Rückantwort aufbauen
			ObjectInputStream ois = new ObjectInputStream(zumServer.getInputStream()); 
			
		   // Daten an Server schreiben
			--> HIER LIEGT DAS PROBLEM:oos.writeObject(pizzen);
			                           oos.flush();
```

Wie könnte ich das ganze realisieren?

Vielen Dank!!


----------



## DocFaust (6. Jan 2009)

Hallo JavaNeuling123,

Ich habs grad ausprobiert, ein Array zu übertragen ist kein Problem. Die Klasse des Arrays sollte sich nur von Serializable ableiten.

Die Fehlermeldung sagt mir allerdings folgendes: Da läuft kein Server, der Dein Array entgegennimmt. Zumindest nicht auf dem Rechner und dem Port, auf den Du möchtest.
Hast Du Dein Serverprogramm schon gestartet? Ist da evtl. ne Firewall dazwischen?

Viel Erfolg
Doc


----------



## JavaNeuling123 (6. Jan 2009)

Doch der Server ist gestartet. 

Nochmal zur Ausganglage: Ich möchte das ein Client dem Sever eine Anzahl an Daten(in meinem Fall, verschiedene Pizzen, die durch ID, Bezeichnung und Preis gekennzeichnet sind) rüberschickt. Da es mehrere Pizzen sind, dachte ich, dass ein Array sinnnvoll wäre! 

Der Server erhält die Daten, holt sich aus dem Array die jeweiligen Preise heraus, summiert diese und schickt sie wieder zurück! Soviel zur Theorie ;-)

Doch wie übertrag ich das Array sinnvoll, so dass ich es am Server weiter sauber bearbeiten kann und
wie lässt sich der Preis summieren?

Das ganze besteht aus drei Klassen(Server, Client, Pizza)

Hier mal der komplette Code:
Der Server

```
mport java.io.*;
import java.net.*;

public class Server 
{
	public Server(int port){
		try
		{
			// Serversocket aufbauen
			ServerSocket serv = new ServerSocket(port);
	
			while(true){
				try
				{
					// Wenn ein Client zum Server verbindet, 
					// ankommende Daten verarbeiten
					Socket zumClient = serv.accept();
					System.out.println("Socket gestartet");
					verarbeiten(zumClient);
				}
				catch(IOException ex)
				{
					ex.printStackTrace();
				}
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public void verarbeiten(Socket sock) throws IOException, ClassNotFoundException
	{
		// Verbindung zum Einlesen der Daten
		ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
        DataOutputStream oos= new DataOutputStream(sock.getOutputStream()); 
		
        //Empfangende Daten wieder als Object einlesen
        Pizza []pizzen = (Pizza[]) ois.readObject();
		
               
        //BEARBEITEN VON []PIZZEN
        //WIE KÖNNTE ICH HIER NUN DEN PREIS JEDES ELEMENTS AUSLESEN????
		
        //Dann das Ergebnis der Addition
        int summierterPreis = 0;
        
        //Ergebnis zurückschreiben
        oos.writeInt(summierterPreis);
		oos.flush();
		oos.close();
		ois.close();
		
		// Verbindung zum Client schließen
		sock.close();
	}

	public static void main(String[] args) 
	{
		new Server(8006);
	}
}
```

DER CLIENT

```
mport java.io.*;
import java.net.*;

public class Client 
{
	public Client(String host, int port)
	{
		Pizza []pizzen = {new Pizza(1, "Salami", 7),
					      new Pizza(2, "Schinken", 10)};
		
		try
		{
			// Verbindung zum Server aufbauen
			Socket zumServer = new Socket(host, port);
			ObjectOutputStream oos = new ObjectOutputStream(zumServer.getOutputStream());			
			
			// Eingabestrom für Rückantwort aufbauen
			DataInputStream ois = new DataInputStream(zumServer.getInputStream()); 
			
			// Daten an Server schreiben
			oos.writeObject(pizzen);
			oos.flush();
						
			// Rückantwort vom Server abwarten und einlesen.
			int ergebnis = ois.readInt();
			System.out.println(ergebnis);
				
			ois.close();
			oos.close();
			
			// Verbindung beenden
			zumServer.close();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}

	public static void main(String[] args) 
	{
		new Client("localhost", 8006);
	}
}
```

DIE KLASSE PIZZA

```
import java.io.Serializable;

public class Pizza implements Serializable{

	private static final long serialVersionUID = 1L;
	public long Id;
	public String Bezeichnung;
	public long Preis;
	
	public long getId() {
		return Id;
	}

	public void setId(long id) {
		Id = id;
	}

	public String getBezeichnung() {
		return Bezeichnung;
	}

	public void setBezeichnung(String bezeichnung) {
		Bezeichnung = bezeichnung;
	}

	public long getPreis() {
		return Preis;
	}

	public void setPreis(long preis) {
		Preis = preis;
	}
	
	public Pizza(long id, String Bezeichnung, long Preis){
		this.Id = id;
		this.Bezeichnung = Bezeichnung;
		this.Preis = Preis;
	}		
}
```


Vielen Dank!!!!!!![/code]


----------



## SlaterB (6. Jan 2009)

fange erstmal ganz ganz ganz ganz einfach an,
und übertrage lediglich einen String 'test', klappt das?

falls du immer noch bei
> java.net.ConnectException: Connection refused: connect 
bist, dann poste den StackTrace komplett, und prüfe genau die Zeilennummern

sowas tritt normalerweise direkt beim Aufbau der Verbindung auf, also bei
> Socket zumServer = new Socket(host, port); 


teste das auch mit

Socket zumServer = new Socket(host, port); 
System.out.println("Verbindung steht");

kommt die Ausgabe?


----------



## JavaNeuling123 (6. Jan 2009)

Hallo,

vielen dank für Eure Hilfe!

Die Klassen, so wie ich sie oben gepostet hab, funktionieren fehlerfrei!Jedoch ist hier die Verarbeitung am Server noch nicht implementiert!


Ich weiß jetzt nur nicht, : 
1. wie ich, wenn ich am Server das Objekt erhalte, dieses behandeln soll? Dieses Object sollte ja eigentlich nun  aus einem Feld mit mehreren Pizzen, die jeweils  mehrere Einträge(Id, Bezeichnung, Preis)bestehen.

2. Wie lese ich die Preise der einzelnen Pizzen aus und addiere diese?

Vielen Dank!!


----------



## SlaterB (6. Jan 2009)

> Die Klassen, so wie ich sie oben gepostet hab, funktionieren fehlerfrei!Jedoch ist hier die Verarbeitung am Server noch nicht implementiert! 


genau, und an der Verbindung zum Server arbeite nun erstmal in einem anderen kleinen Testprogramm,
nicht alles durcheinandermischen solange die einzelnen Schritte nicht bekannt und getestet sind


> wenn ich am Server das Objekt erhalte, dieses behandeln soll?

das Objekt zu erhalten ist eine Sache, ob nun übe einen Socket oder einen ganz normalen Methodenaufruf ist egal,
wenn das Objekt erstmal da ist, dann ist die Art der Übertragung völlig irrelevant, 
alle weiteren Fragen haben nichts mit mit Sockets zu tun, darüber musst du dir grundsätzlich klar werden,


ein Array kann man mit einer Schleife durchlaufen, jede Pizza kann man nach ihren Preis fragen,
wenn dir solch grundsätzliche Dinge nicht bekannt sind, dann siehts ja düster aus,

in jedem Fall empfiehlt sich, dass erstmal lokal zu testen, unabhängig von Client/ Server usw.


----------



## JavaNeuling123 (6. Jan 2009)

Ich möchte ja nur wissen, ob der gewählte Weg so richtig ist:

Sprich:

*Client*
Mehrere Pizzas mit verschiedenen Attributen in Array speichern-->Dieses Array als Object zum Server übertragen!

*Server*
Server erhält das Object.
Frage: Muss ich das Object nun wieder in ein Array umwandeln?

Wenn ja, Array kann nun durchlaufen und bearbeitert werden!

Ist dies so richtig?

Danke!


----------



## DocFaust (6. Jan 2009)

Du hast das Object ja bereits auf Pizza[] gecastet. Ab jetzt kannst Du ganz normal damit arbeiten.


----------



## SlaterB (6. Jan 2009)

dies ist so richtig, siehe erste inhaltliche Zeile der allerersten Antwort von DocFaust


----------

