2012-01-13 2 views
0

Я занимаюсь системой чата RMI в школе и хотел, чтобы с ней был обмен файлами. Раньше ничего подобного не делал и не проходил через это в школе, но я хотел попробовать. Проделали некоторые поиски в google, и это http://java.sun.com/developer/technicalArticles/RMI/rmi_corba/ было лучшее, что я нашел. Является ли эта «технология» новой, поэтому я могу ее использовать? Не удалось заставить его работать, но это может быть недостатком Java. Некоторые советы, почему я не заставляю его работать?Обмен файлами с моим чатом RMI-программой

+0

Corba ничего, кроме нового. – ccoakley

+0

RMI тоже не новый.Прошли ли вы по учебной тропе RMI? http://docs.oracle.com/javase/tutorial/rmi/index.html – ccoakley

ответ

0

Не существует огромной разницы между отправкой сообщений назад и вперед и отправкой файлов. Ответ во многом зависит от того, как выглядит ваш текущий код. У вас есть код для обмена?

Как выглядит ваш текущий интерфейс RMI? Как выглядит ваша архитектура?

У вас есть сервер, к которому подключаются клиенты?

У вас есть метод sendChat (String message)?

Что касается отправки sendChat(), возможно, вы можете добавить sendFile (...). Тогда вопрос только в том, что вы хотите сделать для параметров.

Вы хотите отправить объект java.io.File? Байт [] (вместе с именем String, может быть, логический флаг для различения двоичных файлов)?

Увидев, что это ваш первый раз, вы можете запрограммировать мирские части самостоятельно. Однако такие задачи, как получение байтов из файла, являются довольно распространенными неприятностями. Общие средства Apache и библиотеки гуавы Google предоставляют методы для упрощения процесса. Я полагаю, это зависит от целей обучения, которые у вас есть в этом проекте.

0

Да. Клиенты подключаются к серверу и могут общаться в чатах.

Вот некоторые из кода, который мы имеем до сих пор, за исключением файла для подключения и связи с базой данных и графического интерфейса. Спасибо за ответ.

  • Интерфейсы:

Chatfront интерфейс:

public interface ChatFront extends Remote { 
      boolean registerClient(Client client, String password) throws RemoteException; 
      void logMeOut(Client client) throws RemoteException; 
      void newChannelMessage(String toChannel, String fromUser, String message) throws RemoteException; 
      void newPrivateMessage(String fromUser, String toUser, String message) throws RemoteException; 
      String connectChannel(String username, String channel) throws RemoteException; 
      String disconnectChannel(String username, String channel) throws RemoteException; 
      boolean isUserRegistered(String username) throws RemoteException; 
      void errorMessage(String toUser, String message) throws RemoteException; 
    } 

Clientinterface:

public interface Client extends Remote { 
     String findName() throws RemoteException; 
    void newPrivateMessage(String fromUser, String toUser, String message) throws RemoteException; 
     void newMessageChannel(String toChannel, String fromUser, String message) throws RemoteException; 
     void newSystemMessageChannel(String toChannel, String fromUser, String message) throws RemoteException; 
     void errorMessage(String toUser, String message) throws RemoteException; 
} 

Serverside:

class ChatServer { 
    public static void main(String[] args) throws Exception { 
    String objectname = "chatter"; 
    LocateRegistry.createRegistry(1099); 
    ChatFront cf = new ChatFrontImpl(); 
    Naming.rebind(objectname, cf); 
    javax.swing.JOptionPane.showMessageDialog(null, "Tjener kjører. Trykk OK for å avslutte tjeneren."); 
    Naming.unbind(objectname); 
    System.exit(0); 
    } 
} 

ChatFrontImpl.java

package server; 

import Interfaces.ChatFront; 
import Interfaces.Client; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 
import java.util.ArrayList; 
import java.util.Enumeration; 
import java.util.Hashtable; 

/** 
* 
* @author sindre 
*/ 
class ChatFrontImpl extends UnicastRemoteObject implements ChatFront { 

    private UserDAC u = new UserDAC(); 
    private Hashtable<String, ArrayList<String>> channels = new Hashtable<String, ArrayList<String>>(); 
    private ArrayList<Client> clients = new ArrayList<Client>(); 

    public ChatFrontImpl() throws RemoteException { 
    } 

    /* Registrerer en ny client */ 
    @Override 
    public synchronized boolean registerClient(Client client, String password) throws RemoteException { 
     if(!u.logIn(client.findName(), password)){ 
      System.out.println("feil username eller password"); 
      return false; 
     } 
    if (!clients.contains(client)) { 
      try { 
       clients.add(client); 
      System.out.println("Na er " + client.findName() + " registrert.");  
     } catch (Exception e){ 
      System.out.println("Feil oppstatt i registrerMeg(): " + e); 
      } 
       return true; 
     } else 
      return false; 
    } 

    /* Kobler en client til en kanal */ 
    @Override 
    public String connectChannel(String username, String kanal) throws RemoteException{ 
     if(isUserRegistered(username)){ 
      if (!channels.containsKey(kanal)) { 
      String message = "Bruker " + username + " har ankommet kanalen"; 
      channels.put(kanal, new ArrayList<String>()); 
      channels.get(kanal).add(username); 
      notifyChannelSystem(kanal, "SYSTEM", message); 
      notifySelf(username, "Skriv /? for mulige kommandoer"); 
      return("Kanal opprettet, og bruker satt i kanalen."); 
     } 
     else{ 
      if(channels.get(kanal).contains(username)){ 
       return ("Brukeren er allerede i kanalen."); 
      } else { 
       channels.get(kanal).add(username); 
        String message = "Bruker " + username + " har ankommet kanalen"; 
        notifyChannelSystem(kanal, "SYSTEM", message); 
       return ("Kanal fantes allerede. Bruker satt i kanalen."); 
       } 
     } 
     } 
     return ""; 
    } 

    /*Sjekker om brukeren ikke er blank.*/ 
    @Override 
    public boolean isUserRegistered(String username){ 
     if(username.equals("")){ 
      return false; 
     } 
     return true; 
    } 

    /* Kobler en bruker fra en kanal */ 
    @Override 
    public String disconnectChannel(String username, String channel) throws RemoteException{ 
     if(isUserInChannelX(username, channel)){ 
      channels.get(channel).remove(username); 
      String message = "Bruker " + username + " har forlatt kanalen."; 
      notifySelf(username, " Du har nå forlatt kanalen " + channel); 
      notifyChannelSystem(channel, "SYSTEM", message); 
      if(channels.get(channel).isEmpty()){ 
       channels.remove(channel); 
      } 
     } 
     return ("Bruker har forlatt kanalen."); 
    } 

    /* Kobler en client fra clientlisten */ 
    @Override 
    public synchronized void logMeOut(Client client) throws RemoteException { 
     boolean isfound = false; 
     int clientIndeks = 0; 
     while (clientIndeks < clients.size() && !isfound) { 
      Client denne = clients.get(clientIndeks); 
      if (denne.equals(client)) { // bruker equals() for a sammenlikne stubbobjektene 
       isfound = true; 
       clients.remove(clientIndeks); 
       System.out.println("Na er clienten " + client.findName() + " fjernet."); 
      } else clientIndeks++; 
     } 
     } 

    /* Sjekker om brukeren finnes i en gitt kanal */ 
    public boolean isUserInChannelX(String bruker, String kanal){ 
     if(channels.containsKey(kanal) && channels.get(kanal).contains(bruker)){ 
      return true; 
     } else { 
      return false; 
     } 
    } 

    /* Kaller metoden varsleKanal()*/ 
    @Override 
    public void newChannelMessage(String tilKanal, String fraBruker, String message) throws RemoteException{ 
     if(isUserInChannelX(fraBruker, tilKanal)){ 
      notifyChannel(tilKanal, fraBruker, message); 
     } 
     else{ 
     } 
    } 

    /* Kaller metoden varsleEn() */ 
    @Override 
    public void newPrivateMessage(String fra, String toUser, String message) throws RemoteException{ 
      notifyUser(fra,toUser,message); 
    } 

    @Override 
    public void errorMessage(String toUser, String message) throws RemoteException{ 
     notifySelf(toUser, message); 
    } 

    private void notifySelf(String toUser, String message) throws RemoteException{ 
     for(Client k: clients){ 
      if(k.findName().equals(toUser)){ 
       k.errorMessage(toUser, message); 
      } 
     } 
    } 

    /* Bruker metoden nymessagePrivat() + ser om brukeren er tilkoblet*/ 
    private void notifyUser(String fromUser, String toUser, String message) throws RemoteException{ 
     boolean funnet = false; 
     for(Client k : clients){ 
      if(k.findName().equals(toUser)){ 
       k.newPrivateMessage(fromUser, toUser, message); 
        funnet = true; 
      } 
     } 
     if (!funnet) errorMessage(fromUser, "Ingen brukere ved dette navnet!"); 
    } 

    /* Kjører metoden nymessageKanal() */ 
    private void notifyChannel(String toChannel, String fromUser, String message) throws RemoteException{ 
      if(channels.containsKey(toChannel) && isUserRegistered(fromUser)){ 
       for(String k : channels.get(toChannel)){ 
        for(Client cli : clients){ 
         if(cli.findName().equals(k)){ 
          cli.newMessageChannel(toChannel, fromUser, message); 
         } 
        } 
       } 
      } 
      else{ 
       System.out.println("Brukeren er ikke registrert."); 
      } 
     } 

    private void notifyChannelSystem(String toChannel, String fromUser, String message) throws RemoteException{ 
     if(channels.containsKey(toChannel) && isUserRegistered(fromUser)){ 
       for(String k : channels.get(toChannel)){ 
        for(Client kli : clients){ 
         if(kli.findName().equals(k)){ 
          kli.newMessageChannel(toChannel, fromUser, message); 
         } 
        } 
       } 
      } 
      else{ 
       System.out.println("Brukeren er ikke registrert."); 
      } 
    } 
} 

клиентской:

GUILogic.java

package gui; 

import Interfaces.ChatFront; 
import Interfaces.Client; 
import java.rmi.Naming; 
import java.rmi.RemoteException; 
import klient.ClientImpl; 

/** 
* 
* @author sindre 
*/ 
public class GUILogic { 
    GUI gui; 
    ChatFront cf; 
    public String username; 
    public String channel; 
    public String password; 
    public String message; 

    public GUILogic(GUI gui){ 
     this.gui = gui; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getChannel() { 
     return channel; 
    } 

    public void setChannel(String channel) { 
     this.channel = channel; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    /* Kobler GUI klienten opp mot serveren */ 
    public void createCFConnection(String username, String password) throws Exception{ 

     String objectname = "chatter"; 
     String hostname = "localhost"; 
     String url = "rmi://" + hostname + "/" + objectname; 

     cf = (ChatFront) Naming.lookup(url); 

     Client k = new ClientImpl(username, gui); 
     cf.registerClient(k, password); 
    } 

    public void connectChannel(String username, String channel) throws RemoteException{ 
     cf.connectChannel(username, channel); 
    } 

    public void disconnectChannel(String username, String channel) throws RemoteException{ 
     cf.disconnectChannel(username, channel); 
    } 

    public void newChannelMessage(String toChannel, String fromUser, String message) throws RemoteException{ 
     cf.newChannelMessage(fromUser ,toChannel, message); 
    } 

    public void newPrivateMessage(String fromUser, String toUser, String message) throws RemoteException{ 
     cf.newPrivateMessage(fromUser, toUser, message); 
    } 

    public void errorMessage(String toUser, String message) throws RemoteException{ 
     cf.errorMessage(toUser, message); 
    } 

    /* Logger klienten av GUIen */ 
    public boolean logOut(String username) throws RemoteException{ 
     Client k = new ClientImpl(username, gui); 
     if(k.findName().equals("")){ 
      return false;  
     } else { 
      cf.logMeOut(k); 
      System.out.println("user " + username + " logget ut."); 
      return true; 
     } 
    } 

    /* Analysermessage har funnet/i starten av messageen, og da blir denne metoden kjørt. */ 
    public String commandWritten(String username, String channel, String message) throws RemoteException{ 
     String[] result = message.split(" ", 3); 
     String channel1; 

     if((result[0].equalsIgnoreCase("/join") || (result[0].equalsIgnoreCase("/j")))){ 
      channel1 = result[1]; 
      setChannel(channel1); 
      connectChannel(username, channel1); 
     } 

     else if(result[0].equalsIgnoreCase("/leave") || (result[0].equalsIgnoreCase(("/l")))){ 
      channel = result[1]; 
      disconnectChannel(username, channel); 
     } 

     else if(result[0].equalsIgnoreCase("/whisper") || (result[0].equalsIgnoreCase(("/w")))){ 
      for (int x=2; x<result.length; x++) 
      newPrivateMessage(username, result[1], result[x]); 
     } 

     else if(result[0].equalsIgnoreCase("/exit") || (result[0].equalsIgnoreCase(("/e")))){ 
      System.exit(0); 
     } 

     else if(result[0].equalsIgnoreCase("/?")){ 
      errorMessage(username, "Mulige kommandoer er:" + "\n" + 
        "/leave 'channel' eller /l" + "\n" + 
        "/whisper 'username' eller /w" + "\n" + 
        "/join 'channel' eller /j" + "\n" + 
        "/exit eller /e" + "\n"); 
     } 
     else{ 
      errorMessage(username, "Feil kommando! Skriv /? for mulige kommandoer"); 
     } 
     return message; 
    } 

    /* Analyserer messageen som skrives inn i messagefeltet. Kommandoer starter med/*/ 
    public void analyzeMessage(String username, String channel, String message) throws RemoteException{ 
     String text = getMessage().toLowerCase(); 
     char command = '/'; 
     for(int i = 0; i<1; i++){ 
      char c = text.charAt(0); 
      if(c == command){ 
       commandWritten(username, channel, text); 
      } 
      else { 
       newChannelMessage(username, channel, text); 
      } 
     }   
    } 
} 
Смежные вопросы