Head First JAVA: 18. Chapter - Kamil-Jankowski/Learning-JAVA GitHub Wiki
Service:
import java.rmi.*;
public interface MojaUsluga extends Remote {
    public String powiedzCzesc() throws RemoteException;
}Implementation:
import java.rmi.*;
import java.rmi.server.*;
public class MojaUslugaImpl extends UnicastRemoteObject implements MojaUsluga {
    public MojaUslugaImpl() throws RemoteException {}
    @Override
    public String powiedzCzesc() {
        return "Serwer mowi: 'Czolem!'";
    }
    public static void main(String[] args) {
        try {
            MojaUsluga usluga = new MojaUslugaImpl();
            Naming.rebind("Zdalne_czesc", usluga);
        } catch (Exception e) {e.printStackTrace();}
    }
}Client:
import java.rmi.Naming;
public class MojaUslugaKlient {
    public static void main(String[] args) {
        new MojaUslugaKlient().doRoboty();
    }
    public void doRoboty() {
        try {
            MojaUsluga usluga = (MojaUsluga) Naming.lookup("rmi://127.0.0.1/Zdalne_czesc");
            String s = usluga.powiedzCzesc();
            System.out.println(s);
        }catch(Exception ex){ex.printStackTrace();}
    }
}My servlet:
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class MojSerwletA extends HttpServlet {
    public void doGet(HttpServletRequest zadanie, HttpServletResponse odpowiedz) throws IOException{
        odpowiedz.setContentType("text/html");
        PrintWriter out = odpowiedz.getWriter();
        String komunikat = "Jeśli to czytasz, to znaczy, że serwlet działa!";
        out.println("<HTML><BODY>");
        out.println("<H1>" + komunikat + "</H1>");
        out.println("</BODY></HTML>");
        out.close();
    }
}Testing server:
import java.io.*;
import java.net.*;
import java.util.*;
public class SerwerTestowy {
    private ArrayList strumieneWyjsciowe;
    public static void main(String[] args) {
        new SerwerTestowy().doRoboty();
    }
    private void doRoboty() {
        strumieneWyjsciowe = new ArrayList();
        try{
            ServerSocket gniazdoSerwera = new ServerSocket(5000);
            while(true){
                Socket gniazdoKlienta = gniazdoSerwera.accept();
                PrintWriter pisarz = new PrintWriter(gniazdoKlienta.getOutputStream());
                strumieneWyjsciowe.add(pisarz);
                Thread t = new Thread(new ObslugaKlientow(gniazdoKlienta));
                t.start();
                System.out.println("Mamy połączenie");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private void rozeslijDoWszystkich(String wiadomosc) {
        Iterator czytnik = strumieneWyjsciowe.iterator();
        while (czytnik.hasNext()){
            try {
                PrintWriter pisarz = (PrintWriter) czytnik.next();
                pisarz.println(wiadomosc);
                pisarz.flush();
            }catch(Exception ex){ex.printStackTrace();}
        }
    }
    public class ObslugaKlientow implements Runnable{
        private BufferedReader czytelnik;
        ObslugaKlientow(Socket gniazdoKlienta){
            try{
                InputStreamReader czytelnikStrumienia = new InputStreamReader(gniazdoKlienta.getInputStream());
                czytelnik = new BufferedReader(czytelnikStrumienia);
            } catch (IOException e) {e.printStackTrace();}
        }
        @Override
        public void run() {
            String wiadomosc;
            try{
                while((wiadomosc = czytelnik.readLine()) != null){
                    System.out.println("Odczytano wiadomosc: " + wiadomosc);
                    rozeslijDoWszystkich(wiadomosc);
                }
            }catch(IOException ex){ex.printStackTrace();}
        }
    }
}