Обмен файлами с моей программой RMI в чате - PullRequest
0 голосов
/ 13 января 2012

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

Ответы [ 2 ]

0 голосов
/ 16 января 2012

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

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

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

Интерфейс чата:

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;
    }

Интерфейс клиента :

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;
} 

Сервер:

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); 
            }
        }           
    }
}
0 голосов
/ 13 января 2012

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...