Я занимаюсь системой чата RMI в школе и хотел, чтобы с ней был обмен файлами. Раньше ничего подобного не делал и не проходил через это в школе, но я хотел попробовать. Проделали некоторые поиски в google, и это http://java.sun.com/developer/technicalArticles/RMI/rmi_corba/ было лучшее, что я нашел. Является ли эта «технология» новой, поэтому я могу ее использовать? Не удалось заставить его работать, но это может быть недостатком Java. Некоторые советы, почему я не заставляю его работать?Обмен файлами с моим чатом RMI-программой
ответ
Не существует огромной разницы между отправкой сообщений назад и вперед и отправкой файлов. Ответ во многом зависит от того, как выглядит ваш текущий код. У вас есть код для обмена?
Как выглядит ваш текущий интерфейс RMI? Как выглядит ваша архитектура?
У вас есть сервер, к которому подключаются клиенты?
У вас есть метод sendChat (String message)?
Что касается отправки sendChat(), возможно, вы можете добавить sendFile (...). Тогда вопрос только в том, что вы хотите сделать для параметров.
Вы хотите отправить объект java.io.File? Байт [] (вместе с именем String, может быть, логический флаг для различения двоичных файлов)?
Увидев, что это ваш первый раз, вы можете запрограммировать мирские части самостоятельно. Однако такие задачи, как получение байтов из файла, являются довольно распространенными неприятностями. Общие средства Apache и библиотеки гуавы Google предоставляют методы для упрощения процесса. Я полагаю, это зависит от целей обучения, которые у вас есть в этом проекте.
Да. Клиенты подключаются к серверу и могут общаться в чатах.
Вот некоторые из кода, который мы имеем до сих пор, за исключением файла для подключения и связи с базой данных и графического интерфейса. Спасибо за ответ.
- Интерфейсы:
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);
}
}
}
}
- 1. Проблемы с моим чатом Socket.io
- 2. отключить обмен файлами iTunes
- 3. Безопасный обмен файлами с коллегами
- 4. Обмен файлами с iPhone-приложения
- 5. Обмен файлами между микросервисами
- 6. Обмен объектами между файлами
- 7. Безопасный обмен файлами
- 8. Обмен файлами Excel
- 9. Обмен файлами по Sip
- 10. Обмен «это» между файлами
- 11. Обмен файлами API
- 12. Обмен файлами по внутрисетевой сети
- 13. Обмен файлами библиотек между apks
- 14. Обмен файлами между телефоном Android и ПК
- 15. Обмен файлами Java EE Jar
- 16. Как настроить обмен файлами facebook?
- 17. Обмен файлами Android между приложениями
- 18. Обмен файлами Android через Bluetooth
- 19. Обмен несколькими загруженными файлами ввода
- 20. Обмен файлами с симметричной связью клиент-сервер
- 21. Обмен файлами смены скриптов с переменной
- 22. Docker - Обмен файлами докеров с помощью хоста?
- 23. Обмен файлами между устройствами с использованием сети
- 24. Обмен файлами с программы на компьютер
- 25. Обмен файлами PHP CMS с рейтингом
- 26. Обмен переменными между файлами PHP
- 27. Обмен переменной между несколькими файлами
- 28. Visual Studio - обмен файлами ресурсов
- 29. Обмен файлами Bluetooth без сопряжения
- 30. Realm - обмен файлами между приложениями
Corba ничего, кроме нового. – ccoakley
RMI тоже не новый.Прошли ли вы по учебной тропе RMI? http://docs.oracle.com/javase/tutorial/rmi/index.html – ccoakley