Anda di halaman 1dari 12

PEMROGRAMAN JARINGAN

APLIKASI CHATING DENGAN REMOTE METHODE


INVOCATION

OLEH : KELOMPOK

MUHAMMAD MAPPANYOMPA

H13114306

MIFTAH FARID

H13114308

JONATHAN HANS
H13114320

PROGRAM STUDI ILMU KOMPUTER


DEPARTEMEN MATEMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS HASANUDDIN
MAKASSAR
2016

Aplikasi Chat sederhana dengan RMI :


RMI adalah salah satu bagian dari J2SE yang digunakan untuk
membangun aplikasi terdistribusi menggunakan bahasa Java. RMI adalah
kumpulan kelas dalam Java yang digunakan untuk menangani
pemanggilan (invocation) method secara jarak jauh (remote) dalam suatu
jaringan atau Internet.

Pertama : Membuat Project di IDE Java yang terdiri dari :


-Chat Client
-Chat Server

1. Bagian Server
Membuat Interface baru dengan nama ChatServerInt
ChatServer> New> Interface

Untuk kelas Interface kita namakan : ChatServerInt


import java.rmi.*;
import java.util.*;
public interface ChatServerInt extends Remote{
public boolean login (ChatClientInt a)throws RemoteException ;
public void publish (String s)throws RemoteException ;
public Vector getConnected() throws RemoteException ;
}
Penjelasan :
ChatServerInt ini dibuat untuk pemebentukan interface di kelas Server
dimana akan digunakan nantinya sebagai RMI dari program yang akan
dibuat.

Buat Interface baru dengan nama : ChatClientInt


ChatServer> New> Interface. Berikut syntax Interface :
import java.rmi.*;
public interface ChatClientInt extends Remote{
public void tell (String name)throws RemoteException ;
public String getName()throws RemoteException ;
}
Penjelasan :
ChatClientInt ini dibuat untuk pemebentukan interface di kelas Client
dimana akan digunakan nantinya sebagai RMI dari program yang akan
dibuat.
Membuat kelas ChatServer dalam ChatServer: ChatServer
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
public class ChatServer extends UnicastRemoteObject implements
ChatServerInt{
private Vector v=new Vector();
public ChatServer() throws RemoteException{}
public boolean login(ChatClientInt a) throws RemoteException{
System.out.println(a.getName() + " got connected....");
a.tell("You have Connected successfully.");
publish(a.getName()+ " has just connected.");
v.add(a);
return true;
}
public void publish(String s) throws RemoteException{
System.out.println(s);
for(int i=0;i<v.size();i++){
try{
ChatClientInt tmp=(ChatClientInt)v.get(i);
tmp.tell(s);
}catch(Exception e){
//problem with the client not connected.
//Better to remove it
}
}

}
public Vector getConnected() throws RemoteException{
return v;
}
}

Penjelasan :

Pada fungsi login akan dicetak Username dari user yang sudah
terkoneksi dengan server, lalu server akan memberitahu "You have
Connected successfully." di client. Setelah itu server akan mempublish ke seluruh
client Username yang baru terhubung dengan server, dan Username akan
ditambahkan ke dalam vector yang dibuat. Dan hasil pengembalian nilai berupa true.
Pada prosedur publish akan mencetak Username yang baru
terhubung ke server ke semua client.

Membuat kelas dalam projek ChatServer dengan nama


: StartServer.Berikut Sintaks StartServer
1
2
3
4
5
6
7

import java.rmi.*;
import java.rmi.server.*;
public class StartServer {
public static void main(String[] args) {
try {
//System.setSecurityManager(new
RMISecurityManager());
java.rmi.registry.LocateRegistry.createRegistry(1099);

8
9
10
11
12
13
14
15
16
}
17 }

ChatServerInt b=new ChatServer();


Naming.rebind("rmi://192.168.1.102/myabc", b);
System.out.println("[System] Chat Server is ready.");
}catch (Exception e) {
System.out.println("Chat Server failed: " + e);
}

Penjelasan :
Pada kelas utama akan di Registry pada port 1099 dan akan digunakan
server dengan penggunaan Naming.rebind("rmi://192.168.1.102/myabc", b);
yang berarti server pada IP 192.168.1.102. Dan setelah server disetting seperti yang diatas
maka akan dicetak [System] Chat Server is ready. Yang menendakan bahwa server
sudah siap digunakan. Sedangkan jika tecetak Chat Server failed: berarti terjadi kesalahan
pada port ataupun ip server yang disetting.

2. Client
Membuat Projek Client dengan nama : ChatClientProj

Membuat Interface dengan nama : ChatClientInt dalam projek


ChatClientProj
Membuat Interface dengan nama : ChatServerInt dalam projek
ChatClientProj
Membuat Kelas baru : ChatClient pada projek ChatClientProj

Kelas ChatClient :
1
2
3
4

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class ChatClient extends UnicastRemoteObject implements
ChatClientInt{

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 }

private String name;


private ChatUI ui;
public ChatClient (String n) throws RemoteException {
name=n;
}
public void tell(String st) throws RemoteException{
System.out.println(st);
ui.writeMsg(st);
}
public String getName() throws RemoteException{
return name;
}
public void setGUI(ChatUI t){
ui=t ;
}

Penjelasan :

Pada Konstruktor ChatClient disini akan di gunakan operator


penugasan = untuk memberikan nilai pada variabel lokal name
dengan nilai n.
Pada Prosedur tell berfungsi untuk mencetak pemberitahuan bahwa
user sudah terhubung ke server dan sudah dapat melakukan
aktivitas chatting.
Pada Fungsi getName berfungsi untuk mengembalikan nilai nama.
Pada Prosedur setGUI berfungsi untuk menset tampilan interface.

Membuat Kelas ChatUI dalam projek dalam projek ChatClientProj


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

import javax.swing.*;
import javax.swing.border.*;
import
import
import
import

java.awt.*;
java.awt.event.*;
java.rmi.Naming;
java.util.*;

public class ChatUI{


private ChatClient client;
private ChatServerInt server;
public void doConnect(){
if (connect.getText().equals("Connect")){
if (name.getText().length()<2)
{JOptionPane.showMessageDialog(frame, "You need to type a name.");
return;}
if (ip.getText().length()<2){JOptionPane.showMessageDialog(frame,
"You need to type an IP."); return;}
try{
client=new ChatClient(name.getText());
client.setGUI(this);
server=(ChatServerInt)Naming.lookup("rmi://"+ip.getText()+"/myabc");
server.login(client);
updateUsers(server.getConnected());
connect.setText("Disconnect");
}catch(Exception e)
{e.printStackTrace();JOptionPane.showMessageDialog(frame, "ERROR, we
wouldn't connect....");}
}else{
updateUsers(null);
connect.setText("Connect");
//Better to implement Logout ....
}
}
public void sendText(){
if (connect.getText().equals("Connect")){
JOptionPane.showMessageDialog(frame, "You need to connect
first."); return;
}
String st=tf.getText();
st="["+name.getText()+"] "+st;
tf.setText("");
//Remove if you are going to implement for remote invocation
try{
server.publish(st);
}catch(Exception e){e.printStackTrace();}
}
public void writeMsg(String st){ tx.setText(tx.getText()+"\n"+st); }

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

public void updateUsers(Vector v){


DefaultListModel listModel = new DefaultListModel();
if(v!=null) for (int i=0;i<v.size();i++){
try{ String tmp=((ChatClientInt)v.get(i)).getName();
listModel.addElement(tmp);
}catch(Exception e){e.printStackTrace();}
}
lst.setModel(listModel);
}
public static void main(String [] args){
System.out.println("Hello World !");
ChatUI c=new ChatUI();
}
//User Interface code.
public ChatUI(){
frame=new JFrame("Group Chat");
JPanel main =new JPanel();
JPanel top =new JPanel();
JPanel cn =new JPanel();
JPanel bottom =new JPanel();
ip=new JTextField();
tf=new JTextField();
name=new JTextField();
tx=new JTextArea();
connect=new JButton("Connect");
JButton bt=new JButton("Send");
lst=new JList();
main.setLayout(new BorderLayout(5,5));
top.setLayout(new GridLayout(1,0,5,5));
cn.setLayout(new BorderLayout(5,5));
bottom.setLayout(new BorderLayout(5,5));
top.add(new JLabel("Your name: "));top.add(name);
top.add(new JLabel("Server Address: "));top.add(ip);
top.add(connect);
cn.add(new JScrollPane(tx), BorderLayout.CENTER);
cn.add(lst, BorderLayout.EAST);
bottom.add(tf, BorderLayout.CENTER);
bottom.add(bt, BorderLayout.EAST);
main.add(top, BorderLayout.NORTH);
main.add(cn, BorderLayout.CENTER);
main.add(bottom, BorderLayout.SOUTH);
main.setBorder(new EmptyBorder(10, 10, 10, 10) );
//Events
connect.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ doConnect(); } });
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ sendText(); } });
tf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ sendText(); } });
frame.setContentPane(main);
frame.setSize(600,600);

100
101
102
103
104
105
106
107 }

frame.setVisible(true);
}
JTextArea tx;
JTextField tf,ip, name;
JButton connect;
JList lst;
JFrame frame;

Penjelasan :

Pada Prosedur doConnect akan dilakukan penghubungan client dan


server dimana jika sudah terconnect maka akan di cek apakah
username sudah di isi atau belum (minimal 3 karakter) dan IP
address sudah di isi atau belum. Jika Terjadi kesalahan pada
pengisian IP address maka akan dimunculkan dialog ERROR, we
wouldn't connect....
Pada Prosedur sendText ini akan di cetak text yang sudah kita tulis
untuk client lain dengan menggunakan prosedur publish dengan
syarat client sudah terhubung ke server.
Pada Prosedur writeMsg berfungsi untuk mencetak pesan pada
pesan dialog.
Pada Prosedur updateUser berfungsi untuk menampilkan list user
yang terhubung ke server melalui list vector yang ditambahkan
pada saat user terhubung ke server.
Pada main method akan dicetak Hello World ! lalu membuat objek
untuk menjalankan program chatting yang tadi sudah dibuat
dengan tampilan GUI.

Simulasi Program :
Menjalankan Server :
Server dijalankan melalui kelas StartServer :
Penentuan server address harus di tentukan sesuai dengan alamat IP :

Server address di sesuaikan :


Naming.rebind("rmi://10.160.40.152/myabc", b);
Ketika kelas telah di jalankan maka akan timbul sebuah pesan koneksi :

Kemudian menjalankan ChatUI dalam projek Client :

Anda mungkin juga menyukai