Java Client Socket

4by4

Mitglied
Hey Leute,

Ich hänge bei einem Problem.
Ich arbeite das erste mal mit Sockets und Threads und benötige Hilfe beim senden von Strings.

Nachdem im UI der Benutzer eine neue Bestellung aufnehmen will, sollte der Client vom Server zuerst die Kategorien der Produkte abrufen. Diese werden anschließend im UI angezeigt. Nun kann der Benutzer eine Kategorie wählen und nun werden vom Server diese Produkte über dem Client abgerufen.
Nachdem der Benutzer alle Produkte gewählt hat. Sollte der Server die Menge und die Id der Produkte erhalten.

Zur Zeit mach ich das Test weise mit vorgefertigten Listen. Ich möchte diese Listen aber durch die Abfragen des Clients vervollständigen.

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Client extends Thread {

	final int REQUEST_CATEGORIES = 0;
	final int REQUEST_PRODUCTS = 1;
	final int SEND_PRODUCTS = 2;

	private ArrayList<Category> categories;
	private ArrayList<Product> products;
	
	Socket socket = null;
	String ip = "localhost";
	PrintWriter out = null;
	BufferedReader in = null;

	public static HashMap<Integer, Integer> order;

	public Client() throws Exception {
		initHashMap();
		categories = new ArrayList<Category>();
		products = new ArrayList<Product>();
		
		socket = new Socket(ip, 4711);
		out = new PrintWriter(socket.getOutputStream(), true);
		in = new BufferedReader(
				new InputStreamReader(socket.getInputStream()));
	}
	
	public void run() {
		
	}
	
	/*
	 * Der Client soll diese Liste mit den Informationen vom Server erstellen
	 * 
	 * Der Client soll zuerst die Variable REQUEST_CATEGORIES senden
	 * Als Antwort sollte der Client einmal den Namen der Kategorie und die Id 
	 * erhalten
	 * Mit diesen Informationen sollen neue Kategorien erstellt werden
	 */
	public ArrayList<Category> getCategories() {
		//out.print(REQUEST_CATEGORIES);
		//out.flush();
		//for() {
		//categories.add(new Category(in.readLine(), in.readLine()));
		//}
		categories.add(new Category("Cat1", 1));
		categories.add(new Category("Cat2", 2));
		return categories;
	}

	public void setCategories(ArrayList<Category> categories) {
		this.categories = categories;
	}

	/*
	 * Der Client soll diese Liste mit den Informationen vom Server erstellen
	 * 
	 * Der Client soll zuerst die Variable REQUEST_PRODUCTS senden und die 
	 * Variable "i"
	 * Als Antwort sollte der Client einmal den Namen des Produkts und die 
	 * Id erhalten
	 * Mit diesen Informationen sollen neue Produkte erstellt werden
	 */
	public ArrayList<Product> getProducts(int i) {
		//out.print(REQUEST_PRODUCTS);
		//out.flush();
		//out.print(i);
		//out.flush();
		//for() {
		//products.add(new Product(in.readLine(), in.readLine()));
		//}
		products = new ArrayList<Product>();
		switch (i) {
		case 1:
			products.add(new Product("Product1", 1));
			products.add(new Product("Product2", 2));
			products.add(new Product("Product3", 3));
			products.add(new Product("Product4", 4));
			products.add(new Product("Product5", 5));
			break;

		default:
			products.add(new Product("Product6", 6));
			products.add(new Product("Product7", 7));
			products.add(new Product("Product8", 8));
			break;
		}
		return products;
	}

	public void setProducts(ArrayList<Product> products) {
		this.products = products;
	}

	/*
	 * Nachdem der Benutzer die Auswahl der Produkte betätigt hat 
	 * soll dem Server die Variable
	 * SEND_PRODUCTS übergeben werden
	 * nun sollen die Produkte wie unten in der Methode an den 
	 * Server gesendet werden
	 */
	public void sendOrder() {
			//out.print(SEND_PRODUCTS);
			//out.flush();
		for(Map.Entry<Integer, Integer> e: order.entrySet()) {
			System.out.println("id#" + e.getKey() + "\tamount#" + e.getValue());	
			//out.print(e.getKey());
			//out.flush();
			//out.print(e.getValue());
			//out.flush();
		}
	}

	public void increaseAmount(int key) {
		if(order.containsKey(key)) {
			int tmp = order.get(key);
			tmp++;
			order.put(key, tmp);
		}
		else
			order.put(key, 1);
	}

	public static void initHashMap() {
		order = new HashMap<Integer, Integer>();
	}
}

Bin dankbar für jeden Tipp und Hinweis!

Cheers
 
Zuletzt bearbeitet:
Das "abhören" habe ich nun zu Stande gebracht. Brauche nur noch Hilfe beim versenden.


Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;

public class Client extends Thread {

	final String REQUEST_CATEGORIES = "0";
	final String REQUEST_PRODUCTS = "1";
	final String SEND_PRODUCTS = "2";

	private ArrayList<Category> categories;
	private ArrayList<Product> products;

	Socket socket = null;
	String ip = "localhost";
	PrintWriter out = null;
	BufferedReader in = null;

	public static HashMap<Integer, Integer> order;

	public Client() throws Exception {
		initHashMap();
		categories = new ArrayList<Category>();
		products = new ArrayList<Product>();

		socket = new Socket(ip, 4711);
		out = new PrintWriter(socket.getOutputStream(), true);
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}

	public static void initHashMap() {
		order = new HashMap<Integer, Integer>();
	}

	public ArrayList<Product> getProducts(int id) throws Exception {
		communicate(REQUEST_PRODUCTS + "#" + id);
		return products;
	}

	public void increaseAmount(int key) {
		if (order.containsKey(key)) {
			int tmp = order.get(key);
			tmp++;
			order.put(key, tmp);
		} else
			order.put(key, 1);
	}

	public void sendOrder() throws Exception {
		communicate(SEND_PRODUCTS);
	}

	public void communicate(String request) throws Exception {
		out.print(request);
		out.flush();
		String start = in.readLine();
		String incoming = in.readLine();
		while (!incoming.equals("end") && start.equals("cat")) {
			for (int i = incoming.length() - 1; i > 0; i--) {
				if (incoming.charAt(i) == '#') {
					categories.add(new Category(incoming.substring(0, i),
							Integer.parseInt(incoming.substring(i + 1,
									incoming.length()))));
				}
			}
			incoming = in.readLine();
		}
		while (!incoming.equals("end") && start.equals("pro")) {
			for (int i = incoming.length() - 1; i > 0; i--) {
				if (incoming.charAt(i) == '#') {
					products.add(new Product(incoming.substring(0, i), Integer
							.parseInt(incoming.substring(i + 1,
									incoming.length()))));
				}
			}
			incoming = in.readLine();
		}
		if (start.equals("orders") && !incoming.equals("end")) {
			for (int i : order.keySet()) {
				out.print(i + "#" + order.get(i));
				out.flush();
			}
			out.print("end");
			out.flush();
		}
	}

	public ArrayList<Category> getCategories() throws Exception {
		communicate(REQUEST_CATEGORIES);
		return categories;
	}
}

#Edit
Mit eine bischen Hirnschmalz selbst auf die Lösung gekommen.

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;

public class Client extends Thread {

	final String REQUEST_CATEGORIES = "0";
	final String REQUEST_PRODUCTS = "1";
	final String SEND_PRODUCTS = "2";

	private ArrayList<Category> categories;
	private ArrayList<Product> products;

	Socket socket = null;
	String ip = "localhost";
	PrintWriter out = null;
	BufferedReader in = null;

	public static HashMap<Integer, Integer> order;

	public Client() throws Exception {
		initHashMap();
		categories = new ArrayList<Category>();
		products = new ArrayList<Product>();

		socket = new Socket(ip, 4711);
		out = new PrintWriter(socket.getOutputStream(), true);
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}

	public static void initHashMap() {
		order = new HashMap<Integer, Integer>();
	}

	public ArrayList<Product> getProducts(int id) throws Exception {
		products = new ArrayList<Product>();
		communicate(REQUEST_PRODUCTS + "#" + id);
		return products;
	}

	public void increaseAmount(int key) {
		if (order.containsKey(key)) {
			int tmp = order.get(key);
			tmp++;
			order.put(key, tmp);
		} else
			order.put(key, 1);
	}

	public void sendOrder() throws Exception {
		communicate(SEND_PRODUCTS);
	}

	public void communicate(String request) throws Exception {
		out.println(request);
		out.flush();
		String start = in.readLine();
		String incoming = in.readLine();
		while (!incoming.equals("end") && start.equals("cat")) {
			for (int i = incoming.length() - 1; i > 0; i--) {
				if (incoming.charAt(i) == '#') {
					categories.add(new Category(incoming.substring(0, i),
							Integer.parseInt(incoming.substring(i + 1,
									incoming.length()))));
				}
			}
			incoming = in.readLine();
		}
		while (!incoming.equals("end") && start.equals("pro")) {
			for (int i = incoming.length() - 1; i > 0; i--) {
				if (incoming.charAt(i) == '#') {
					products.add(new Product(incoming.substring(0, i), 
							Integer.parseInt(incoming.substring(i + 1,
									incoming.length()))));
				}
			}
			incoming = in.readLine();
		}
		if (start.equals("orders") && !incoming.equals("end")) {
			out.println("order");
			out.flush();
			for (int i : order.keySet()) {
				out.println(i + "#" + order.get(i));
				out.flush();
			}
			out.println("end");
			out.flush();
		}
	}

	public ArrayList<Category> getCategories() throws Exception {
		communicate(REQUEST_CATEGORIES);
		return categories;
	}
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück