czat w RMI

0

Czesc!

Jakiś czas temu dostałam program napisany w Corbie od kolegi który miał na zajęciach programowanie w javie. Nadeszła chwila, że i ja mam programowanie z tym ze Corby (jeszcze) nie mielismy. W tej chwili jestesmy przy RMI i mamy stworzyć czata. Przez jakiś czas próbowałam przerobić program z tej Corby do RMI. (Rozumiem ze takie podejście nie jest mile widziane, jednak RMI ma wiele podobnego do Corby. Według mnie program powinien działać jednak wywalają się błędy. Czy moglibyście wskazać ewentualne błędy które zrobiłam przy przerabianiu tego programu?

interfejs (jednakowy zarówno po stronie klienta jak i serwera):

package serwer;

import java.rmi.Remote;
import java.rmi.RemoteException;



		if(!isUser(username)){
			users.add(new User(username));
			System.out.println("Przychodzi nowy user: \""+username+"\"");
			return true;
		} else {
			System.out.println("User \""+username+"\" jest już zalogowany");
			return false;
		}
	}
	
	public boolean logout(String username) throws RemoteException {
		boolean loggedOut = false;
		Iterator iter = users.iterator();
		int index = 0;
		while(iter.hasNext()){
			User currUser = (User)iter.next();
			if(currUser.getNick().equals(username)){
				users.remove(index);
				System.out.println("User \""+username+"\" zostal wylogowany");
				loggedOut = true;
				break;
			}
			index++;
		}
		return loggedOut;
	}
	
	
	public boolean sendTextToUser(String username, String text) throws RemoteException{
		boolean isUser = false;
		if(users.isEmpty()){
			return false;
		}
		Iterator iter = users.iterator();
		while(iter.hasNext()){
			User currUser = (User)iter.next();
			if(currUser.getNick().equals(username)){
				currUser.getKolejka().add(text);
				isUser = true;
				break;
			}
		}
		return isUser;
	}
	
	
	public boolean sendTextToAll(String text) throws RemoteException{
		if(users.isEmpty()){
			return false;
		}
		Iterator iter = users.iterator();
		while(iter.hasNext()){
			User currUser = (User)iter.next();
			currUser.getKolejka().add(text);
		}
		return true;
	}
	
	
	public String getText(String username) throws RemoteException{
		StringBuffer wiadomosci = new StringBuffer();
		Iterator iterUsers = users.iterator();
		while (iterUsers.hasNext()) {
			User currUser =(User)iterUsers.next();
			if (currUser.getNick().equals(username)) { 
				Iterator iterKolejka = currUser.getKolejka().iterator();
				while(iterKolejka.hasNext()) {
					wiadomosci.append((String)iterKolejka.next());
					wiadomosci.append("\n");
				}
				currUser.getKolejka().clear();
				break;
			} 
		}
		return wiadomosci.toString();
	}
	
	
	private boolean isUser(String nick) throws RemoteException{
		boolean userExist = false;
		Iterator iter = users.iterator();
		if(!iter.hasNext()){
			return false;
		}
		while(iter.hasNext()){
			User user = (User)iter.next();
			if(user.getNick().equals(nick)){
				userExist = true;
				break;
			} else {
				userExist = false;
			}
		}
	   return userExist;
	}
	
		
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		System.setSecurityManager(new RMISecurityManager());
		Serwer bs = new Serwer();
try{
		Naming.rebind("rmi://127.0.0.1:1104/Serwer", bs);
		System.out.println("Serwer wystartowal !!!");}
		catch(AccessControlException ace){
            System.out.println("[error] nie masz uprawnien aby uruchomic serwer\n na tym porcie dla podanej nazwy hosta\n"+ace+"\n");
     }
		// TODO Auto-generated method stub

	}

}

Klasa User (na sewerze):

package serwer;
import java.io.Serializable;
import java.util.ArrayList;

public class User implements Serializable{
	public static final long serialVersionUID = -174385187518067482L;
	
	public User(String nick){
		this.nick = nick;
	}
	public String getNick(){
		return nick;
	}
	public ArrayList getKolejka(){
		return kolejka;
	}
	private String nick = null;
	private ArrayList kolejka = new ArrayList();
}

i wreszcie klasa klienta:

package klient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.Remote;
import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import klient.Inter;

public class Klient {
	
	public Klient()
	{
		
	}
	
	public static void main (String[] args){
	
		try {
		System.setSecurityManager(new RMISecurityManager());
		//Klient klient = new Klient();
		Remote r = (Inter)Naming.lookup("rmi://127.0.0.1:1104/Serwer");
		Inter bs;
		if (r instanceof Inter)
				{
				bs = (Inter) r;
				String nick = new String();
				StringBuffer tekst = new StringBuffer();
				StringBuffer uzytkownik = new StringBuffer();
				StringBuffer pomoc = new StringBuffer();
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("(HH:mm:ss)");
				int menu = -1;
				boolean wylogowany = false;
				BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
				System.out.println("Podaj nicka: ");
				pomoc.append(br.readLine());
				while (!bs.login(pomoc.toString()))
					{
					pomoc.delete(0, pomoc.length());
					System.out.print("taki uzytkownik juz istnieje\npodaj innego nicka:");
					pomoc.append(br.readLine());
					}
		
				nick = pomoc.toString();
				pomoc.delete(0, pomoc.length());
				System.out.println("menu:\n" +
				"'zaloguj' - zaloguj ponownie\n" +
				"'do_usera' - pisz do uzytkownika\n" +
				"'do_wszystkich' - pisz do wszystkich\n" +
				"'wyloguj' - wyloguj\n" +
				"'odbierz' - odbierz wiadomosci\n" +
				"'zamknij' - wyjscie z programu");
				while(menu!=5) {
					pomoc.delete(0,pomoc.length());
					pomoc.append(br.readLine());
					String p = pomoc.toString();
					if (p.equalsIgnoreCase("zaloguj")) menu = 0;
						else if (p.equalsIgnoreCase("do_usera")) menu = 1;
							else if (p.equalsIgnoreCase("do_wszystkich")) menu = 2;
								else if (p.equalsIgnoreCase("wyloguj")) menu = 3;
									else if (p.equalsIgnoreCase("odbierz")) menu = 4;
										else if (p.equalsIgnoreCase("zamknij")) menu = 5;
											else menu = 6;
					switch(menu) {
						case 0:
						  if (wylogowany) {
						  System.out.print("podaj nicka: ");
						  pomoc.delete(0,pomoc.length());
						  pomoc.append(br.readLine());
						  while (!bs.login(pomoc.toString())) {
						  System.out.print("taki uzytkownik jest juz zalogowany\npodaj nicka: ");
								pomoc.delete(0,pomoc.length());
								pomoc.append(br.readLine());
							}
						  wylogowany = false;
						  nick = pomoc.toString();
						  pomoc.delete(0,pomoc.length());
						  System.out.println("menu:\n" +
						 		"'zaloguj' - zaloguj ponownie\n" +
								"'do_usera' - pisz do uzytkownika\n" +
								"'do_wszystkich' - pisz do wszystkich\n" +
								"'wyloguj' - wyloguj\n" +
								"'odbierz' - odbierz wiadomosci\n" +
								"'zamknij' - wyjscie z programu");
							} else {
								System.out.println("jestes juz zalogowany");
							}
							break;
						case 1:
							if (!wylogowany) {
								String date = simpleDateFormat.format(Calendar.getInstance().getTime(), new StringBuffer(), new FieldPosition(0)).toString();
							tekst.delete(0,tekst.length());
							uzytkownik.delete(0,uzytkownik.length());
							System.out.print("podaj nazwe uzytkownika: ");
							uzytkownik.append(br.readLine());
							System.out.print("podaj tresc wiadomosci: ");
							tekst.append("<Od \""+nick+"\" "+date+"> ");
							tekst.append(br.readLine());
							if (bs.sendTextToUser(uzytkownik.toString(),tekst.toString())){
							System.out.println("wiadomosc zostala wyslana do "+uzytkownik);
								}else {
									System.out.println("brak uzytkownika "+uzytkownik);
								}
							} else {
								System.out.println("nie jestes zalogowany");
							}
							break;
						case 2:
							if (!wylogowany) {
					String date = simpleDateFormat.format(Calendar.getInstance().getTime(), new StringBuffer(), new FieldPosition(0)).toString();
							tekst.delete(0,tekst.length());
							tekst.append("<Od \""+nick+"\" "+date+"> ");
							System.out.print("podaj tresc wiadomosci: ");
							tekst.append(br.readLine());
							if (bs.sendTextToAll((tekst.toString()))){
								System.out.println("wiadomosc wyslana do wszystkich");
							} else {
								System.out.println("wiadomosc nie nie zostala wyslana");
							}
				        		} else {
							System.out.println("nie jestes zalogowany");
							}
							break;
						case 3:
							if (!wylogowany) {
								if (bs.logout(nick)) {
								System.out.println("\""+nick+"\" zostales wylogowany");
								wylogowany = true;
								}else {
								System.out.println("blad wylogowania uzytkownika "+nick);	
								}
							}else {
								System.out.println("zostales juz wylogowany");
							}
							break;
						case 4:
							String wiad = bs.getText(nick);
							if (wiad.length()!=0){
								System.out.print(wiad);	
							} else {
								System.out.println("brak wiadomosci");
							}
							break;
						case 5:
							//bs.shutdown();
							//Zamkniecie aplikacji klienta
							System.exit(0);
							break;
						default:
							System.out.println("brak takiego przelacznika");
							break;
					}
				}
				}
		
		} catch (RemoteException re){
			re.printStackTrace();
		} catch (java.net.MalformedURLException mue) {
			mue.printStackTrace();
		} catch (java.io.IOException ioe) {
			ioe.printStackTrace();
		} catch (java.rmi.NotBoundException nbe) {
			nbe.printStackTrace();
		}
		
	}
}

Od razu powiem ze program zarówno klienta jak i serwera się kompiluje (nie wywala zadnych błędów)
Natomiast podczas uruchamiania serwera wywalane są różne błędy, nie wiem czego dotyczą
http://img158.imageshack.us/img158/4977/beztytu322upz6.jpg

Z góry wielkie dzięki
Pozdrawiam

0

Pomóżcie please :-/

0

a na kiedy to masz?

0

Znalazłam. W sumie głupi błąd powinno być tak:
Remote r = Naming.lookup("rmi://127.0.0.1:1104/Serwer");
i dopiero po tym
bs = (Inter) r;

z tym ze do tego momentu już program nie dochodzi bo warunek
if (r instanceof Inter)
zwraca false i okno klienta się zamyka :-/

0

a tak że zapytam gdzie ty masz ten interfejs? nie widac nawet jakie metody zawiera po stronie klienta tak samo !

0

po pierwsze ta linijka

Remote r = (Inter)Naming.lookup("rmi://127.0.0.1:1104/Serwer"); tak się nierobi bo rzutujesz typ Remote na typ Inter (co powinno zwrocic chyba jakis wyjatek) powinno byc

Remote r = Naming.lookup("rmi://127.0.0.1:1104/Serwer");

a następnie sprawdzasz warunek (zreszta niewiem po co? jak i tak "serwer" zwraca jeden interfejs a gdy go nie zwroci to znaczy ze serwer nie został zarejestrowany w miregistry) wiec po tym piszesz po prostu:

bs = (Inter) r; tak jak masz za warunkiem (wywal po prostu ten warunek)

0

ehh nie zauważyłem, że już sie poprawiłaś :P. Ciężko się przegląda bo NIE MA tutaj sporej części kodu

0

interfejs jest w sumie prosty. Zaledwie 5 prostych metod.

package klient;

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface Inter extends Remote {

	public boolean login (String username) throws RemoteException;
	
	public boolean logout (String username) throws RemoteException;
	
	public boolean sendTextToUser (String username, String text) throws RemoteException;
	
	public boolean sendTextToAll (String text) throws RemoteException;

	public String getText (String username) throws RemoteException;
}

Oczywiście znajduje sie on zarówno po stronie klienta jak i serwera

0

Mam do napisania cos w rodzaju czat aplikacji uzwajac RMI. gdzie oglbym znalezc jakies przyklady kodu. Dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1