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