# Server - Client - Fehler?



## raven (24. Nov 2008)

Hallo Leute ...

Ich hab ein Problem... Ich hab mir ein mehr oder weniger einfaches Server-client Programm geschrieben, wo sich mehere Clients zur gleichen zeit einloggen könn... Zur Zeit sol nur eine ID des Clients an den Server übermittelt werden udn der Server soll alle ID's an alle Clients verteilen. Solange ien Client eingeloggt ist funktioniert die Übertragung, jedoch sobald sich ein 2. Client einloggt... werden die Daten nicht mehr richtig übermittelt...

Ich poste einfach mal den Code... Ist Konsolenbasierend... vllt. könntet ihr das mal testen... ich sitz hier schon seit um 9 an dem selben Problem und habe keine Lösung...


```
// Server.java

import java.net.*;
import java.util.*;
import java.io.*;

public class Server extends Thread {

	public ServerSocket server_socket;

	public Vector connections;

	public int id = 0;

	public static void main(String[] args) {
		try {
			Server server = new Server(4410);
			server.start();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}

	public Server(int port) throws IOException {
		server_socket = new ServerSocket(port);
		System.out.println("Server is running...");
		System.out.println("Waiting for client to connect.");
		connections = new Vector();
	}

	public void run() {
		try {
			Socket client_socket;
			while((client_socket = wait_connection(server_socket)) != null) {
				Connection c = new Connection(this, client_socket, id);
				connections.add(c);
				id++;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public Socket wait_connection(ServerSocket server_socket) throws IOException {
		Socket socket = server_socket.accept();
		return socket;
	}

	public void write_message() throws IOException {
		for(int x = 0; x < connections.size(); x++) {
			for(int y = 0; y < connections.size(); y++) {
				Connection a = (Connection)connections.get(x);
				Connection b = (Connection)connections.get(y);
				PrintWriter print_writer = new PrintWriter(new OutputStreamWriter(a.client_socket.getOutputStream()));
				print_writer.print(b.id);
				print_writer.flush();
			}
		}
	}
}
```


```
// Connection.java

import java.net.*;
import java.io.*;

public class Connection extends Thread {

	public Server server;
	public Socket client_socket;

	public BufferedReader buffered_reader;

	public String message;

	public int id;

	public Connection(Server server, Socket client_socket, int id) {
		this.server = server;
		this.client_socket = client_socket;
		this.id = id;
		message = ""+id;
		this.start();
	}

	public void run() {
		try {
			while((message = read_message(client_socket)) != null) {
				System.out.println(message+", ");
				this.sleep(2000);
            	}
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		catch(InterruptedException e) {
			e.printStackTrace();
		}
	}

	public String read_message(Socket socket) throws IOException {
		if(id == 0) {
			server.write_message();
		}
		buffered_reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		char[] buffer = new char[200];
		int count_of_chars = buffered_reader.read(buffer, 0, 200);
		String message = new String(buffer, 0, count_of_chars);
		return message;
	}
}
```


```
// Client.java

import java.net.*;
import java.util.*;
import java.io.*;

public class Client extends Thread  {

	public Socket socket;

	public String message = "Client is connect.";

	public static void main(String[] args) {
			try {
				Client client = new Client(4410);
				client.start();
			} catch (IOException e) {
 	    			e.printStackTrace();
			}
	}

	public Client(int port) throws IOException {
		String ip = "localhost";
		socket = new Socket(ip, port);
		write_message(socket, message);
	}

	public void run() {
			try {
				while((message = read_message(socket)) != null) {
					System.out.println(message+", ");
					write_message(socket, message);
					this.sleep(2000);
				}
			} catch(IOException e) {
				e.printStackTrace();
			}
			catch(InterruptedException e) {
				e.printStackTrace();
			}
	}

	public void write_message(Socket socket, String message) throws IOException {
		PrintWriter print_writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
		print_writer.print(message);
		print_writer.flush();
	}

	public String read_message(Socket socket) throws IOException {
		BufferedReader buffered_reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		char[] buffer = new char[200];
		int count_of_chars = buffered_reader.read(buffer, 0, 200);
		String message = new String(buffer, 0, count_of_chars);
		return message;
	}
}
```

Wäre schon wenn einer von euch ein paar ratschläge hat, warum das nicht funktioniert...

mfg


----------



## FArt (24. Nov 2008)

Ist mir ehrlich gesagt zu aufwendig, zumal es zu solchen Themen im Netz einen Haufen fertige Beispiele gibt.

Hast du dir denn über Multithreadind, Synchronisation, konkurrierende Zugriffe entsprechende Gedanken gemacht, oder sind das Fremdwörter für dich?

Ist das Beispiel an sich sinnvoll und ist es mit deinem Wissen sinnvoll sich an so etwas heranzuwagen (der Code sieht mir nämlich ziemlich nach Anfänger bzw. "einfach mal loscodiert" aus?


----------



## raven (24. Nov 2008)

Multithreadind sagst mir was...
Synchronisation eher nicht... bin ich in dem fall auf Synchronisation zwangsmäßig angewiesen?


----------



## FArt (24. Nov 2008)

raven hat gesagt.:
			
		

> Multithreadind sagst mir was...
> Synchronisation eher nicht... bin ich in dem fall auf Synchronisation zwangsmäßig angewiesen?



Nein, aber wenn du nicht weißt, wofür das benötigt wird, wirst du auch nicht erkennen wann du darauf angewiesen bist.

Tipp:
http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

Google bringt weitere Tutorials und Beispiele, auch zum Thema Synchronisation ...


----------

