Server-Client Chat mit RMI diesmal mit Codetags

Java_Bruno

Grünschnabel
Hallo zusammen

Habe bei meinem ersten Beitrag keine Codetags verwendet deshalb hier nochmals der Thread diesesmal mit Codetags.
Habe ein kleines und einfaches Java Chatprogramm angepasst und würde dieses gerne auf mehreren Rechner laufen lassen. Solange ich die Server und Client Codes im selben Package habe, läuft das Programm wunderbar. Wenn ich aber den Server und den Client aus verschiedenen Packages (auf dem gleichen Rechner) starten möchte erhalte ich folgende Fehlermeldung:

java.lang.ClassCastException: P_Server.ChatServerImpl_Stub cannot be cast to P_Client.ChatServer

Kann mir jemand sagen woran dies liegt, beziehungsweise wie ich den Code anpassen muss, damit es läuft?

Meine Packete heissen:
- P_Server mit allen Codes
- P_Client mit den Clientcodes

Mein Quelltext ist unterteilt in:
2 Interfaces (TalkServer_Interface und TalkClient_Interface
2 Classes (TalkServer und TalkClient)

Die Quellcodes sind wie folgt :

Interface: TalkServer_Interface
Code:
package P_Server;

import java.rmi.*;

public interface TalkServer_Interface extends Remote
{
	public boolean addClient(TalkClient_Interface objRef) throws RemoteException;
	public void removeClient(TalkClient_Interface objRef) throws RemoteException;
	public void sendMessage(String name, String msg)
	throws RemoteException;
}

Klasse: TalkServer
Code:
package P_Server;

	import java.rmi.*;
	import java.rmi.server.*;
	import java.util.*;
	import java.rmi.registry.LocateRegistry;
	import java.rmi.registry.Registry;

	@SuppressWarnings("serial")
	public class TalkServer extends UnicastRemoteObject implements TalkServer_Interface
	{
	    private ArrayList<TalkClient_Interface> allClients;

	    public TalkServer() throws RemoteException
	    {
	        allClients = new ArrayList<TalkClient_Interface>();
	    }

	    public synchronized boolean addClient(TalkClient_Interface objRef)
	    throws RemoteException
	    {
	        String name = objRef.getName();
	        for(Iterator<TalkClient_Interface> iter = allClients.iterator(); iter.hasNext();)
	        {
	            TalkClient_Interface cc = iter.next();
	            try
	            {
	                if(cc.getName().equals(name))
	                {
	                    return false;
	                }
	            }
	            catch(RemoteException exc)
	            {
	                iter.remove();
	            }
	        }
	        allClients.add(objRef);
	        return true;
	    }

	    public synchronized void removeClient(TalkClient_Interface objRef)
	    throws RemoteException
	    {
	        allClients.remove(objRef);
	    }

	    public synchronized void sendMessage(String name, String msg)
	    throws RemoteException
	    {
	        for(Iterator<TalkClient_Interface> iter = allClients.iterator(); iter.hasNext();)
	        {
	            TalkClient_Interface cc = iter.next();
	            try
	            {
	                cc.print(name + ": " + msg);
	            }
	            catch(RemoteException exc)
	            {
	                iter.remove();
	            }
	        }
	    }

	    public static void main(String[] args)
	    {
	        try
	        {
				LocateRegistry.createRegistry(Registry.REGISTRY_PORT); 
	            TalkServer server = new TalkServer();
	            Naming.rebind("rmi://192.168.56.1/ChatServer", server);
	        }
	        catch(Exception e)
	        {
	            System.out.println(e);
	            e.printStackTrace();
	        }
	    }
	}

Interface: TalkClient_Interface
Code:
package P_Client;

public interface TalkClient_Interface extends java.rmi.Remote
{
	public String getName() throws java.rmi.RemoteException;
	public void print (String msg) throws java.rmi.RemoteException;
}

Klasse: TalkClient
Code:
package P_Client;

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.io.*;

@SuppressWarnings("serial")
public class TalkClient extends UnicastRemoteObject implements TalkClient_Interface
{
    private String name;

    public TalkClient(String n) throws RemoteException
    {
        name = n;
    }

    public String getName() throws RemoteException
    {
        return name;
    }

    public void print(String msg) throws RemoteException
    {
        System.out.println(msg);
    }
}

class TalkClientMain
{
    public static void main(String[] args)
    {
        try
        {
            TalkServer_Interface server = (TalkServer_Interface) Naming.lookup("rmi://localhost/ChatServer");
            System.out.println("Kontakt zu Server hergestellt");
            System.out.println("Um dem Chat beitreten und teilnehmen zu können,");
            System.out.println("müssen Sie ein Pseudonym wählen:");
            // Chatteilnehmer müssen für die Teilnahme ein Pseudonym eingeben
            // dieses Pseudonym wird in der Variable 'user' abgelegt.
        	String user="";
            {
                try
                {
                    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                    String line="";
                    line=input.readLine();
                    user=line;
                }
                catch(Exception e)
                {
                    System.out.println(e);
                 }
            }
            args[1]=user;
            TalkClient client = new TalkClient(args[1]);
            if(server.addClient(client))
            {
                System.out.println("Ende durch Einagbe 'Ende' "+ "oder 'ende'");
                sendInputToServer(server, args[1]);
                server.removeClient(client);
            }
            else
            {
                System.out.println("Es ist schon jemand unter "+ "diesem Namen angemeldet");
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        System.exit(0);
    }

    private static void sendInputToServer(TalkServer_Interface server, String name)
    {
        try
        {
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            String line;
            while((line = input.readLine()) != null)
            {
                if(line.equals("ende") || line.equals("Ende"))
                {
                    break;
                }
                server.sendMessage(name, line);
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

Ich starte das ganze in Eclipse. Zuerst der TalkServer (stellt einen Server unter localhost zur Verfügung). Danach starte ich Clients (stellt eine Verbindung zum Server auf localhost her), der Loginname muss jeweils gewählt werden, wobei mehrere identische Namen nicht möglich sind.

Wenn alles im selben Package ist geht es einwandfrei, aber Starte ich Server und Clients aus verschiedenen Packages (auch wenn vom selben Rechner), erscheint die Meldung: java.lang.ClassCastException: P_Server.TalkServer_Stub cannot be cast to P_Client.TalkServer_Interface

Wäre Euch für jegliche Hilfe und Tipps dankbar. Grüsse
Bruno
 
Hi Bruno,
bei mir läuft der Chat nach ausbauen der IndexOutOfBounceException (auch wenn die Programmarchitektur meiner Meinung nach verbesserungswürdig ist).

Code:
class TalkClientMain
{
    public static void main(String[] args)
    {
        try
        {
            TalkServer_Interface server = (TalkServer_Interface) Naming.lookup("rmi://localhost/ChatServer");
            System.out.println("Kontakt zu Server hergestellt");
            System.out.println("Um dem Chat beitreten und teilnehmen zu können,");
            System.out.println("müssen Sie ein Pseudonym wählen:");
            // Chatteilnehmer müssen für die Teilnahme ein Pseudonym eingeben
            // dieses Pseudonym wird in der Variable 'user' abgelegt.
        	String user="";
            {
                try
                {
                    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                    String line="";
                    line=input.readLine();
                    user=line;
                }
                catch(Exception e)
                {
                    System.out.println(e);
                 }
            }
            //BUG args[1]=user;
            TalkClient client = new TalkClient(user);
            if(server.addClient(client))
            {
                System.out.println("Ende durch Einagbe 'Ende' "+ "oder 'ende'");
                sendInputToServer(server, user);
                server.removeClient(client);
            }
            else
            {
                System.out.println("Es ist schon jemand unter "+ "diesem Namen angemeldet");
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        System.exit(0);
    }
 
Zurück