sms chat
DESCRIPTION
mengirim dan menerima smsTRANSCRIPT
Java merupakan suatu bahasa pemograman yang multi platform dan multi device.
Java juga merupakan bahasa pemograman yang berorientasi objek dan program java
tersusun dari bagian yang disebut kelas. Kelas terdiri atas metode-metode yang
melakukan pekerjaan dan mengembalikan informasi setelah melakukan tugasnya.
Beberapa keunggulan java yaitu java merupakan bahasa yang sederhana. Java
dirancang agar mudah dipelajari dan digunakan secara efektif. Java tidak menyediakan
fitur-fitur yang rumit.
Pada bagian kali ini saya akan mencoba untuk membuat suatu aplikasi chatting
multiclient sederhana dengan menggunakan tampilan grafis berbasis bahasa
pemograman java. Dimana nanti masing-masing client yang terhubung ke jaringan
dapat langsung bercakap-cakap secara langsung.
Pertama yang harus dilakukan kita terlebih dahulu melakukan setting alamat IP
pada masing-masing client. Pada percobaan ini kita akan menggunakan 1 server dan 1
client. Adapun alamat IP nya adalah sebagai berikut :
a. Server
Ip address :
10.10.10.1
Netmask :
255.0.0.0
b. Client
Ip address :
10.10.10.2
Netmask :
255.0.0.0
Setelah melakukan konfigurasi IP pada masing-masingi komputer kemudian kita juga
harus memastikan bahwa firewall pada masing-masing komputer harus diaktifkan
karena pada beberapa kasus program ini tidak dapat saling terkoneksi akibat firewall
yang aktif pada sistem operasinya.
Lalu install Textpad versi 7 dan jdk versi 7 pada masing-masing komputer.
Kemudian langkah selanjutnya kita mengetikan listing program java untuk aplikasi
chatting ini dengan menggunakan TextPad. Programnya terbagi menjadi dua bagian
yaitu bagian server dan client. Adapun listing programnya adalah sebagai berikut.
1. ChatServer.javaimport
java.io.*;
import
java.net.*
; import
java.util.
*;
public class ChatServer {
private static int uniqueId;
private ArrayList<ChatServer.ClientThread> clients; private int port;private boolean keepGoing;
public
ChatServ
er()
{ this.p
ort =
9999;
clients = new ArrayList();}
public void
start()
{ keepGo
ing =
true;
try {
ServerSocket serverSocket = new ServerSocket(port); while (keepGoing) {
System.out.println("ChatServer waiting for Clients on port "
+ port + ".");Socket socket =
serverSocket.accept(); if
(!keepGoing) {
break;
}
ChatServer.ClientThread t = new ChatServer.ClientThread(socket); clients.add(t);t.start();send("login~" + t.username + "~" +
t.username + " sedang login...~Server~\n");}try
{ serverSock
et.close();
for (int i = 0; i < clients.size(); ++i) { ChatServer.ClientThread tc = clients.get(i); try {
tc.sInput.close();tc.sOutput.close();tc.socket.close();
} catch (IOException ioE) {}
}} catch (Exception e) {
System.out.println("Exception closing the server and clients: " + e);
}} catch (IOException e) {
String msg = "Exception on new ServerSocket: " + e + "\n"; System.out.println(msg);
}}
private synchronized void
send(String message) { for
(int i = clients.size(); --i
>= 0;) {
ChatServer.ClientThread ct =
clients.get(i); if (!
ct.writeMsg(message)) {
clients.remove(i);System.out.println("Disconnected Client " +
ct.username + " removed from list.");}
}}
ChatServer.ClientThread t = new ChatServer.ClientThread(socket); clients.add(t);t.start();send("login~" + t.username + "~" +
t.username + " sedang login...~Server~\n");}try
{ serverSock
et.close();
for (int i = 0; i <
clients.size(); ++i) { ChatServer.ClientThread tc = clients.get(i); try {
tc.sInput.close();tc.sOutput.close();tc.socket.close();
} catch (IOException ioE) {}
}} catch (Exception e) {
System.out.println("Exception closing the server and clients: " + e);
}} catch (IOException e) {
String msg = "Exception on new ServerSocket: " + e + "\n"; System.out.println(msg);
}}
private synchronized void
send(String message) { for
(int i = clients.size(); --i
>= 0;) {
ChatServer.ClientThread ct =
clients.get(i); if (!
ct.writeMsg(message)) {
clients.remove(i);System.out.println("Disconnected Client " +
ct.username + " removed from list.");}
}
}
private String
getClients()
{ String s = "";
for (ClientThread clientThread : clients) { s += clientThread.username + ":";
}s += "---";
System.out.print
ln(s); return s;
}
private synchronized void
remove(int id) { for (int i = 0;
i < clients.size(); ++i) {
ChatServer.ClientThread ct = clients.get(i); if (ct.id == id) {
clients.remove(i);return;
}}
}
public static void
main(String[] args)
{ ChatServer server = new
ChatServer();
server.start();
}
private class ClientThread extends Thread {
private Socket socket;
private ObjectInputStream sInput; private ObjectOutputStream sOutput; private int id;private String username;
public ClientThread(Socket socket) {
id = +
+uniqueId;
this.socket
= socket;
System.out.println("Menciptakan Object Input/Output Streams"); try {
sOutput = new
ObjectOutputStream(socket.getOutputStream()
); sInput = new
ObjectInputStream(socket.getInputStream());
String message = (String)
sInput.readObject();
username =
message.split("~")[1];
System.out.println(username
+ " masuk.");
} catch (IOException e) {System.out.println("Exception creating
new Input/output Streams: " + e);} catch (ClassNotFoundException e) {}
}
@Override
public void run() {boolean
keepGoing =
true; while
(keepGoing) {
String
message
; try {
message =
sInput.readObject().toString();
} catch (IOException e) {
System.out.println(username + " Exception reading
Streams: " + e);break;
} catch (ClassNotFoundException e2) { break;
}
String type = message.split("~")[0];
String pengirim = message.split("~")[1];String text = message.split("~")[2];String kepada = message.split("~")[3];String response;
switch
(type) {
case
"postTex
t":
response = "recieveText~" + pengirim + "~" + text + "~" + kepada +
"~\n";send(response);
break;case "postPrivateText":response = "recievePrivateText~" + pengirim +
"~" + text + "~" + kepada + "~\n";send(response);break;case "login":response = "login~" + pengirim + "~" + text + "~" + kepada +
"~\n";send(response);break;case "logout":
response = "logout~" + pengirim + "~" + text + "~" + kepada +
"~\n";send(response);brea
k;
case
"list
":
response = "list~server~" + getClients() + "~ ~ ~ ~ ~\n"; send(response);break;
}}
remove(id);
close();}
private void
close() {
try {
if (sOutput !
= null) {
sOutput.c
lose();
}} catch (Exception e) { } try {
if (sInput !
= null)
{ sInput
.close()
;
} } catch (Exception e) { } try {
if (socket !
= null)
{ socket
.close()
;
} } catch (Exception e) { }
}
private boolean
writeMsg(String msg) {
if (!
socket.isConnected())
{
close
();
retur
n
false
;
}try
{ sOutput.write
Object(msg);
} catch (IOException e) {System.out.println("Error sending message to " + username); System.out.println(e.toString());
}return true;
}}
}
2. ChatClient.java
import java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import java.net.Socket;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.logging.Level;
import
java.util.logging.Logger;
import
javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.table.DefaultTableModel;
public class ChatClient extends javax.swing.JFrame {
/**
* Creates new form ChatClient */private ObjectInputStream input; private ObjectOutputStream output; private Socket socket;private String server, username; private int port;private List<String> clients;
public ChatClient() {
clients = new
ArrayList();
initComponents();
}
public boolean
start() { try {
socket = new Socket(server, port); } catch (Exception ec) {
System.out.println("Error connectiong to
server:" + ec); return false;
}
String msg = "Connection accepted " +
socket.getInetAddress() + ":" + socket.getPort();
System.out.println(msg);
try {
input = new
ObjectInputStream(socket.getInputStream());
output = new
ObjectOutputStream(socket.getOutputStream());
} catch (IOException eIO) {System.out.println("Exception creating new
Input/output Streams: " + eIO);return false;
}
new ChatClient.ListenFromServer().start();
try {
output.writeObject("login~" + username + "~" + username + " sedang login...~server~\n");
output.writeObject("list~" + username + "~" +
username + " sedang login...~server~\n");
} catch (IOException eIO)
{ System.out.println("Exception doing login
: " + eIO); disconnect();
return false;}
return true;
}
private void
disconnect() { try
{
// TODO add your handling code here:
output.writeObject("logout~" + username + "~" + username +
" sudah logout...~Server~\n"); } catch (IOException ex) {
//
Logger.getLogger(ChatClient.class.getName()).log(Level.S
EVERE, null, ex);
}
try {
if (input !=
null)
{ input.close
();
}} catch (Exception e) { } try {
if (output !=
null)
{ output.clos
e();
} } catch (Exception e) { }try {
if (socket !=
null)
{ socket.clos
e();
}} catch (Exception e) {}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
always * regenerated by the Form Editor. */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed"
desc="Generated Code"> private void
initComponents() {
jScrollPane1 = new
javax.swing.JScrollPane();
viewTextArea = new
javax.swing.JTextArea();
jScrollPane2 = new
javax.swing.JScrollPane();
clientTable = new
javax.swing.JTable(); postTextField
= new javax.swing.JTextField();
kirimButton = new
javax.swing.JButton(); lbljpg = new
javax.swing.JLabel(new
ImageIcon("D:/nikii.jpg"));jLabel2 = new javax.swing.JLabel();
serverTextField = new
javax.swing.JTextField(); jLabel3 =
new javax.swing.JLabel();
portTextField = new
javax.swing.JTextField(); masukButton
= new javax.swing.JButton(); jLabel4 =
new javax.swing.JLabel();
usernameTextField = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
viewTextArea.setEditable(false);
viewTextArea.setColumns(20);
viewTextArea.setLineWrap(true);viewTextArea.setRows(5);viewTextArea.setFocusable(false);jScrollPane1.setViewportView(viewTextArea);
jScrollPane2.setViewportView(clientTable);
postTextField.addActionListe
ner(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt)
{postTextFieldActionPerformed(evt);
}
});
kirimButton.setText("Kirim");
kirimButton.addActionListe
ner(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt)
{kirimButtonActionPerformed(evt);
}});
jLabel2.setText("Server");
serverTextField.setText("127.0.0.1");
jLabel3.setText("Port");
portTextField.setText("9999");
masukButton.setText("Masuk");
masukButton.addActionListe
ner(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt)
{masukButtonActionPerformed(evt);
}});
jLabel4.setText("Username");
usernameTextField.setText("niki");
javax.swing.GroupLayout
layout = new
javax.swing.GroupLayout(getContentP
ane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
addGroup(layout.createSequentialGroup().addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING).addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(postTextField)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(kirimButton))
.addComponent(jScrollPane1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2,
javax.swing.GroupLayout.PREFERRED_SIZE, 259,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(lbljpg)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(serverTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, 167,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
\ .addComponent(portTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, 46,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(usernameTextField,
javax.swing.GroupLayout.DEFAULT_SIZE, 194,
Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(masukButton)))
.addContainerGap()));layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE).addComponent(lbljpg).addComponent(jLabel2).addComponent(serverTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(portTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(masukButton)
.addComponent(jLabel4)
.addComponent(usernameTextFiel
d,
javax.swing.GroupLayout.PREFERR
ED_SIZE,
javax.swing.GroupLayout.DEFAULT_
SIZE,
javax.swing.GroupLayout.PREFERRE
D_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING).addComponent(jScrollPane2,
javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 427,
Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE).addComponent(postTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(kirimButton))))
.addContainerGap()));
pack();
}// </editor-fold>
private void
masukButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// TODO add your handling code
here: this.server =
serverTextField.getText();
this.port = new Integer(portTextField.getText()); this.username = usernameTextField.getText(); start();
}
private void
kirimButtonActionPerformed(java.awt.event.ActionEvent
evt) {
// TODO add your handling code here: try {
String message = "postText~" + username + "~" + postTextField.getText() + "~all~\n";
output.writeObject(message);postTextField.setText
(""); } catch
(IOException ex) {
Logger.getLogger(ChatClient.class.getName()).log(Level.
SEVERE, null, ex);
}}
private void
postTextFieldActionPerformed(java.awt.event.Action
Event evt) {
// TODO add your handling
code here:
kirimButtonActionPerformed(ev
t);
}
/**
* @param args the command line arguments */public static void main(String args[]) {
/* Set the Nimbus look and feel *///<editor-fold defaultstate="collapsed" desc="
Look and feel setting code (optional) ">/* If Nimbus (introduced in Java SE 6) is not
available, stay with the default look and feel.* For details see
http://download.oracle.com/javase/tutorial/uiswing/lookan
dfeel/plaf.htm l
*/
try
{
for
(javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels())
{
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;}
}} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(ChatClient.class.getName()).log(java
.util.logging.Level.SEVERE, null, ex);} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ChatClient.class.getName()).log(java
.util.logging.Level.SEVERE, null, ex);} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ChatClient.class.getName()).log(java
.util.logging.Level.SEVERE, null, ex);} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ChatClient.class.getName()).log(java
.util.logging.Level.SEVERE, null, ex);}//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new
Runnable() {
@Overridepublic void run() {
new ChatClient().setVisible(true);
}});
}
/ Variables declaration - do not
modify private
javax.swing.JTable clientTable;
private javax.swing.JLabel
jLabel2; private
javax.swing.JLabel jLabel3;
private javax.swing.JLabel
jLabel4;
private javax.swing.JScrollPane
jScrollPane1; private
javax.swing.JScrollPane jScrollPane2;
private javax.swing.JButton
kirimButton; private
javax.swing.JButton masukButton;
private javax.swing.JTextField
portTextField; private
javax.swing.JTextField postTextField;
private javax.swing.JTextField
serverTextField;
private javax.swing.JTextField
usernameTextField; private
javax.swing.JTextArea viewTextArea;
private JLabel lbljpg ;
/ End of variables declaration
class ListenFromServer extends Thread {
@Overridepublic void run() {while (true) {
try {Strin
gmsg = (String) input.readObject();
String res;
String type = msg.split("~")[0];
Stringpengirim = msg.split("~")[1];
String text = msg.split("~")[2];
String kepada = msg.split("~")[3];
switch (type) {
case "recieveText":res = pengirim + ": " + text;
viewTextArea.setText(viewTextArea.
getText()
+ res + "\n");break;
case "recievePrivateText":TEKNIK KOMPUTER POLSRI
res = pengirim + ": " +
text; if
(kepada.equals(username)
) {
viewTextArea.setText(viewTextArea.getText() + res + "\n");
}break;
case
"login":
viewTextArea.setText(viewTextArea.
getText() + pengirim + " sedah login..." + "\n");
clients.add(pengirim);break;
case
"logout":
viewTextArea.setText(viewTextArea.
getText() + pengirim + " telah logout..." + "\n");
clients.remove(pengirim);break;
case
"list":
setTable(text);break;
}} catch (IOException e)
{ System.out.println("Server has
close the
connection: " + e);break;
} catch (ClassNotFoundException e2) {}
}}
private void setTable(String text) {
int rows =
text.split(":").length - 1;
Object[][] data = new
Object[rows][1]; for (int i =
0; i < rows; i++) {
String t =
text.split(":")[i];
data[i][0] = t;
}
String[] header = {"Clients"};
clientTable.setModel(new DefaultTableModel(data, header));
}
}}
Jika kedua program telah selesai dibuat maka kita compile program tersebut
dengan menekan tombol CTRL + 1. Jika progam tidak memiliki kesalahan akan timbul
pesan Tool Compiled Successfully. Kemudian jalankan program. Adapun hasil
programnya adalah sebagai berikut :