RMI RMI - Brauche Hilfe?

Extremefall

Bekanntes Mitglied
Hallo,
ich habe mir schon etliche RMI Tutorials angeschaut, leider weiß ich nicht, wie ich es am Ende umsetzen kann. Mein Code bisher:
RMI-Interface:
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface SocketIf extends Remote{
Client getClient() throws RemoteException;
}
RMI-Methode (siehe weiter unten):
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Client extends UnicastRemoteObject implements SocketIf,Runnable, ActionListener {
	private PrintWriter printWriter;
	private OutputStreamWriter outputstreamwriter;
	private OutputStream outputstream;
	private InputStream input;
	private Socket clientSocket;

	public Client(InetAddress IP, int port) throws RemoteException {
		clientSocket = null;
		try {
			clientSocket = new Socket(IP, port);
			outputstream = clientSocket.getOutputStream();
			outputstreamwriter = new OutputStreamWriter(outputstream);
			printWriter = new PrintWriter(outputstreamwriter);
			Thread sender = new Thread(this);
			sender.start();
		}

		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void closeClient() {

	}

	public void sendMessage(String nachricht) {
		printWriter.println(nachricht);
		printWriter.flush();
	}
	public void diw(){
		System.out.println("Diw");
	}
	public void run() {
		while (true) {
			if (!clientSocket.isConnected()) {
				try {
					System.out.println("hi");
					clientSocket.close();
					System.exit(0);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == ServerGUI.getscreenshot) {
try {
            File file = new File("c:/IMG_0065.jpg");
            OutputStream out;
			
				out = clientSocket.getOutputStream();
			
            InputStream fileIn = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            while (fileIn.available()>0){
                out.write(buffer,0,fileIn.read(buffer));
            }
            fileIn.close();
			}catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			System.out.println("Sende");
			sendMessage("New Message");
			try {
				outputstream.close();
				clientSocket.close();
				System.exit(0);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		}
	}

	@Override
	public Client getClient() throws RemoteException {
		return this;
	}
}
Server:
Java:
import java.net.*;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class Server implements Runnable{
	private InputStream inputstream;
	private BufferedReader stdIn;
	private InputStreamReader inputstreamreader;
	private Socket client;
	public static boolean getScreenshot;
    public Server(int port) throws Exception {
        ServerSocket socketServer = new ServerSocket(port);
       while (true) {
            client = socketServer.accept();
            Thread t = new Thread(this);
            t.start();
        }
    }
    public boolean isGetScreenshot(){
    	return getScreenshot;
    }
   
    public void run() {
    		try {
			FileOutputStream fileOut = new FileOutputStream("Screenshot.jpg");
            byte[] buffer = new byte[1024];
            while (client.isConnected()){
                InputStream input = client.getInputStream();
                int bytesRead = input.read(buffer);
                if (bytesRead ==-1) break;
                fileOut.write(buffer,0,bytesRead);
            }
            fileOut.close();
            BufferedImage bild = ImageIO.read(new File("Screenshot.jpg"));           
            int imagewidth = bild.getWidth();
            int imageheight = bild.getHeight();
            JFrame frame = new JFrame("");
            frame.setSize(imagewidth,imageheight);
            ImageIcon icon = new ImageIcon( "Screenshot.jpg" );
            JLabel label = new JLabel( icon );
            frame.add(label);
            frame.setVisible(true);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		
    	}
		try {
			inputstream = client.getInputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        inputstreamreader = new InputStreamReader(inputstream);
         stdIn = new BufferedReader(inputstreamreader);
        String userInput;

        try {
			while ((userInput = stdIn.readLine()) != null) {
			    System.out.println("echo: " + userInput);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
	
}
ServerGUI:
Java:
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.RemoteException;

import javax.swing.JButton;
import javax.swing.JFrame;


public class ServerGUI {
public static JButton getscreenshot;
	/*
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
    	getscreenshot = new JButton("Screenshot vom Clienten anzeigen");
    	if (Execution_Client.client == null){
    		System.out.println("No objekt");
    		System.out.println(Execution_Client.client);
    	}
    	
    	getscreenshot.addActionListener(new Client(InetAddress.getByName("127.0.0.1"),4447));

    	frame.add(getscreenshot);
    	frame.setVisible(true);
	}
	
	

}
Wie kann ich nun also über die Socket-Verbindung auf die RMI Methode zugreifen? Was muss noch implementiert werden? Funktioniert es wohl mit this, dass das aktuelle Client Objekt zurückgegeben wird? Oder wie sollte ich es sonst machen? Ich bin noch relativ neu auf dem Gebiet und weiß noch nicht, wie der Zugriff auf die andere JVM geschieht.
 

Michael...

Top Contributor
Bis auf die Interface Definition sehe ich hier nichts von RMI. Sieht eher so aus als soll hier direkt eine Socketverbindung aufgebaut werden.
Solltest Dich als erst einmal auf die Technik festlege RMI oder Socket und dann vielleicht die passenden Tutorials genauer anschauen.
Lässt sich der Code überhaupt komplilieren? Ich steig da nicht so ganz durch, was hier versucht wird.
 

chalkbag

Bekanntes Mitglied
Na ja, da du ja laut dem Thread http://www.java-forum.org/java-basics-anfaenger-themen/122599-client-ergibt-null.html#post793351 erst so seit 14:40 etwas von RMI weißt, bezweifle ich das du dich schon ausgiebig damit beschäftigt hast.

RMI ist kein leichtes Thema, da kann man für die Grundlagen schon mal ein paar Stunden verbrauchen.

Schau erstmal ob du die Beispiele unter folgender Seite überhaupt zum laufen bekommst.
RMI Mini Tutorial

Auch ist das Eclipse RMI Plugin sehr zu empfehlen, um so Sachen wie Registrierung starten/beenden etwas zu erleichtern.
 

Extremefall

Bekanntes Mitglied
Eine ganz wichtige Frage zu RMI:
Kann man damit auch eine Verbindung zu einem anderen PC via IP etc. herstellen und so z.B. vom PC A an den PC B eine Nachricht schicken, wie mit Sockets? Oder ist es nur dazu da, dass Methoden einer anderen JVM genutzt werden können?
 

Extremefall

Bekanntes Mitglied
Das ist ja super. Gibt es da eine Einschränkung mit der IP? Bei Sockets musste man ja folgendes machen:
InetAddress.getByName("127.0.0.1");
Da kann man also auch die öffentliche IP einfach nutzen oder? Lokal funktioniert es.
Und ist "Server " der Name in der Registry?
Code:
//127.0.0.1/Server
 
M

Marcinek

Gast
Nein, du fragst bei einem Namingdienst an und sagst, welche Referenz du haben möchtest.

Dann bekommst du diese in einer Form, die es dir ermöglicht Methoden (Stubs) aufzurufen, die auf einer entfernten VM sog. Skelettons implementiert.

Ich finde es fanzinierend, wie du es schaffst die wichtigen posts einfach zu überlesen. Das hier führt dich nicht zum erfolg.

1. Dein Wissen in Java ist zu klein dafür
2. Bekommst du hier ganz andere Limitationen als mit Sockets.

Gruß,

Martin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
J Brauche hilfe bei Projekt: Netzwerk Chatprogramm Netzwerkprogrammierung 12
André B. Brauche Hilfe bei Chat Netzwerkprogrammierung 6
O Ich brauche RIP- und OSPF-Quellcodes? Netzwerkprogrammierung 3
I Welche IP/Addresse brauche ich ? Netzwerkprogrammierung 9
P Was brauche ich alles / wo sollte ich einen Blick drauf werfen? Netzwerkprogrammierung 17
J Objekt mit RSA und AES verschlüsseln und entschlüsseln HILFE Netzwerkprogrammierung 4
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
C JSON, API ... Anfänger braucht eure Hilfe Netzwerkprogrammierung 10
KingSquizzi3 Website parsen mit Hilfe von jsoup funktioniert nicht Netzwerkprogrammierung 3
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
B JKS erstellen bitte um hilfe Netzwerkprogrammierung 1
R Hilfe bei FTP Netzwerkprogrammierung 7
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6
R Benötige Hilfe bei Routereinstellungen Netzwerkprogrammierung 7
xDarkSunx Hilfe Chat Login Netzwerkprogrammierung 7
K Datenübertragung UDP Hilfe ????? Netzwerkprogrammierung 5
H Hilfe bei multiplen Clients Netzwerkprogrammierung 7
N Client - Server kurze Hilfe bitte Netzwerkprogrammierung 2
T IP Adresse mit Hilfe der MAC Adresse ermitteln Netzwerkprogrammierung 3
D Hilfe ich komme bei meinem UDP chat Server nicht mehr weiter Netzwerkprogrammierung 9
D Hilfe, meine HttpURLConnection hängt manchmal. Netzwerkprogrammierung 9
eQui Hilfe bei Chatprogramm Netzwerkprogrammierung 3
TRunKX Hilfe beim senden und empfangen Netzwerkprogrammierung 2
D Netzwerk Game, bitte hilfe. Netzwerkprogrammierung 2
N JMS Newbie braucht hilfe Netzwerkprogrammierung 6
S Noob braucht dringend hilfe bei ftp-client Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben