Probleme mit Server/Client

Solan

Grünschnabel
Ich habe mich jetzt ein wenig mit Server und Clients beschäftigt. Der Client funktioniert wunderbar nur mit dem Server habe ich noch son Problem. Ich möchte im gesamten Programm die Möglichkeit haben Nachrichten an einen bestimmten oder an alle Clients zu schicken...

Nur irgendwie funktioniert das nicht. Ich glaube, dass die Clients nur über meinen ClientThread angesprochen werden können ... Vielleicht hat einer ja einen Tipp, wie ich das ganze richtig umsetze:

Code:
public class conventionspiele extends Window {

	public static SocketList sockets = new SocketList();
	
	public Socket[] clients = new Socket[10];
			
	public static void main(String[] args) {

		int cnt = 0;
		try {
			System.out.println("Warte auf Verbindungen auf Port 2222...");
			ServerSocket echod = new ServerSocket(2222);
			while (true) {
				Socket socket = echod.accept();
				EchoClientThread test = new EchoClientThread(++cnt, socket);
				sockets.add(test);
				test.start();
				test.sendToClient("Your Client: #" + test.name + " your position: #" + sockets.getPositionByName(test.getIntName()) + " of "+ sockets.size());

			}
		} 
		catch (IOException e) {
			System.err.println(e.toString());
			System.exit(1);
		}


	}

}

Code:
import java.net.*;
import java.io.*;

class EchoClientThread extends Thread {
	public int name;
	public Socket socket;
	public InputStream in;
	public OutputStream out;
	
	public EchoClientThread(int name, Socket socket)	{
		this.name   = name;
		this.socket = socket;
	}
	
	public void sendToClient(String message) {
		try {
			out = socket.getOutputStream();
			out.write((message + "\r\n").getBytes());
		}
		catch (IOException e) {
			System.err.println(e.toString());
		}
	}
	
	public int getIntName() {
		return name;
	}
	
	public void run() {
		String msg = "EchoServer: Verbindung " + name;
		System.out.println("Client " + name + " has connected");
		try {
			in = socket.getInputStream();
			out = socket.getOutputStream();
			out.write((msg + "\r\n").getBytes());
			int c;
			while ((c = in.read()) != -1) {
				out.write((char)c);
				System.out.print((char)c);
			}
			socket.close();
		} 
		catch (IOException e) {
			System.out.println("Client " + name + " has closed Connection");
			conventionspiele.sockets.delete(conventionspiele.sockets.getPositionByName(name));
		}
	}
}

Code:
public class SocketList {

	private SLNode head, tail;
	private int size;

	public SocketList() {
		head = null; tail = null;
		size = 0;
	}
	
	public int size(){
		return size;	
	}
	public boolean isEmpty() {
		return (size==0);
	}

	public void delete(int position) {
		if(!isEmpty()) {
			SLNode newest = getNodeAtPosition(position);
			newest.next.prev = newest.prev;
			newest.prev.next = newest.next;
			size--;
		}
	}
	
	public SLNode getNodeAtPosition(int position) {
		SLNode newest = head;
		if(position > 0 && position <= size) {
				for(int i = 1; i <= position; i++) {
					newest = newest.next;
				} 
		}
		return newest;
	}

	public int getPositionByName(int name) {
		int j = 1;
		SLNode newest = head;		
		for(j = 1; j <= size; j++) {
			if(newest.element.name == name) {
				return j;
			}
			else {
				newest = head.next;
			}
		}
		return j;
	}
	
	public EchoClientThread getClientByName(int name) {
		int position = getPositionByName(name);
		return retrieve(position);
	}
	
	public EchoClientThread retrieve(int position) {
		SLNode newest = this.getNodeAtPosition(position);
		return newest.element;
	}
	
	public void add(EchoClientThread e) {
		SLNode y = new SLNode(e, tail, null);
		if(size == 0) {
			this.head = y;
		}
		if(size > 0) {
			this.tail.next = y;
		}
		this.tail = y;	
		size++;
	}	
	
	public void sendToAllClients(String message) {
		SLNode newest = head;
		if(!isEmpty()) {
			for(int j = 1; j <= size; j++) {
				newest.element.sendToClient(message);
				newest = newest.next;
			}				
		}
	}
}

Die Funktion sendToAllClients soll hier eigentlich eine Nachricht an alle Clients schicken. Macht es aber nicht... Fehlermeldungen oder so werden nicht ausgeworfen. Scheint so, als wenn hier die Clients nicht bekannt wären. Obwohl ich extra eine Client Liste erstellt habe

Code:
public class SLNode {
	public EchoClientThread element;
	public SLNode prev,next;

	public SLNode(EchoClientThread e, SLNode p, SLNode n) {
		element = e;
		prev = p;
		next = n;
	}
}

Ich würde mich über Tipps und Anregungen freuen. Es reicht mir, wenn ihr mir sagt, was ich falsch mache und vielleicht erklärt, wie ich es richtig mache *G*
Einen fertigen Code möchte ich nicht haben, da ich es eigentlich schon selbst machen möchte.
 

schnuffie

Erfahrenes Mitglied
Also schmeiß' erstmal alles weg. ;)

Nein, im Ernst, ich würde so Einiges umstellen.
Du machst ja sowas Ähnliches, wie einen Chat-Client.

Schau Dir mal das gut beschriebene Beispiel in Netz an:
http://java.seite.net/chat/

Wenn Du die Sache so angehst, kommst Du sicherlich weiter.
 

Neue Beiträge