SlideShare a Scribd company logo
MEMBUAT PROGRAM MULTICLIENT CHATTING CLIENT-SERVER
MENGGUNAKAN BAHASA PEMROGRAMAN JAVA BERBASIS
GRAFIS
Oleh :
AINI MAISI
(0611 3070 1291)
6CD
JURUSAN TEKNIK KOMPUTER
POLITEKNIK NEGERI SRIWIJAYA
PALEMBANG
MEMBUAT PROGRAM MULTICLIENT CHATTING CLIENT-SERVER
MENGGUNAKAN BAHASA PEMROGRAMAN JAVA BERBASIS
GRAFIS
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.
Dengan Chatting memungkinkan kita untuk selalu bisa berkomunikasi
walaupun kita tidak berada bersamanya di suatu tempat. Aplikasi chatting
merupakan suatu aplikasi yang memungkinkan pengguna (client)
berkomunikasi teks secara langsung (Real Time) dengan pengguna lain dengan
menggunakan media yang ada.
Pada bagian ini, saya akan membuat aplikasi chatting berbasis grafis (seperti
tampilan foto) menggunakan bahasa pemograman java. pertama yang harus
dilakukan adalah menyetting alamat IP pada masing-masing PC. Kita menggunakan
satu server dan satu client.
Pertama yang harus dilakukan kita terlebih dahulu melakukan setting
alamat IP pada masing-masing client. 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.
Berikut adalah listing program MultiClient Chatting Client-Server
berbasis grafis (gambar)
 ChatServer.java
import 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 ChatServer() {
this.port = 9999;
clients = new ArrayList();
}
public void start() {
keepGoing = 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 {
serverSocket.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.println(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 "postText":
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);
break;
case "list":
response = "list~server~" + getClients() +
"~ ~ ~ ~ ~n";
send(response);
break;
}
}
remove(id);
close();
}
private void close() {
try {
if (sOutput != null) {
sOutput.close();
}
} 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();
return false;
}
try {
sOutput.writeObject(msg);
} catch (IOException e) {
System.out.println("Error sending message to " +
username);
System.out.println(e.toString());
}
return true;
}
}
}
 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.SEVERE,
null, ex);
}
try {
if (input != null) {
input.close();
}
} catch (Exception e) {
}
try {
if (output != null) {
output.close();
}
} catch (Exception e) {
}
try {
if (socket != null) {
socket.close();
}
} 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("E:/rara.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.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
postTextFieldActionPerformed(evt);
}
});
kirimButton.setText("Kirim");
kirimButton.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
kirimButtonActionPerformed(evt);
}
});
jLabel2.setText("Server");
serverTextField.setText("10.17.0.0");
jLabel3.setText("Port");
portTextField.setText("9999");
masukButton.setText("Masuk");
masukButton.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
masukButtonActionPerformed(evt);
}
});
jLabel4.setText("Username");
usernameTextField.setText("Rara Ariesta");
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI
NG)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(postTextField)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(kirimButton))
.addComponent(jScrollPane1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.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.RELATE
D)
.addComponent(serverTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, 167,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(portTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, 46,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(usernameTextField,
javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(masukButton)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI
NG)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.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(usernameTextField,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.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.RELATE
D)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align
ment.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.ActionEvent evt) {
// TODO add your handling code here:
kirimButtonActionPerformed(evt);
}
/**
* @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/lookandfeel/pla
f.html
*/
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() {
@Override
public 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 {
@Override
public void run() {
while (true) {
try {
String msg = (String) input.readObject();
String res;
String type = msg.split("~")[0];
String pengirim = 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":
res = pengirim + ": " + text;
if (kepada.equals(username)) {
viewTextArea.setText(viewTextArea.getText() + res + "n");
}
break;
case "login":
viewTextArea.setText(viewTextArea.getText() + pengirim + " sudah
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));
}
}
}
Pastikan kita sudah terhubung ke internet. Lalu eksekusi program
menggunakan ctrl+1 dan ctrl+2, maka tampilan akan seperti berikut:
Multi client

More Related Content

What's hot

TDC2016SP - Trilha .NET
TDC2016SP - Trilha .NETTDC2016SP - Trilha .NET
TDC2016SP - Trilha .NET
tdc-globalcode
 
13 networking, mobile services, and authentication
13   networking, mobile services, and authentication13   networking, mobile services, and authentication
13 networking, mobile services, and authentication
WindowsPhoneRocks
 
Java VS Python
Java VS PythonJava VS Python
Java VS Python
Simone Federici
 
Why Learn Python?
Why Learn Python?Why Learn Python?
Why Learn Python?
Christine Cheung
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
Alfonso Peletier
 
Networking Core Concept
Networking Core ConceptNetworking Core Concept
Networking Core Concept
Rays Technologies
 
Java весна 2013 лекция 2
Java весна 2013 лекция 2Java весна 2013 лекция 2
Java весна 2013 лекция 2
Technopark
 
MQTT and Java - Client and Broker Examples
MQTT and Java - Client and Broker ExamplesMQTT and Java - Client and Broker Examples
MQTT and Java - Client and Broker Examples
Micha Kops
 
The state of your own hypertext preprocessor
The state of your own hypertext preprocessorThe state of your own hypertext preprocessor
The state of your own hypertext preprocessor
Alessandro Nadalin
 
Pre zen ta sion
Pre zen ta sionPre zen ta sion
Pre zen ta sion
Sajid Alee Mosavi
 
Jason parsing
Jason parsingJason parsing
Jason parsing
parallelminder
 
Lexical environment in ecma 262 5
Lexical environment in ecma 262 5Lexical environment in ecma 262 5
Lexical environment in ecma 262 5
Kim Hunmin
 
The Ring programming language version 1.5.4 book - Part 44 of 185
The Ring programming language version 1.5.4 book - Part 44 of 185The Ring programming language version 1.5.4 book - Part 44 of 185
The Ring programming language version 1.5.4 book - Part 44 of 185
Mahmoud Samir Fayed
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
DEVTYPE
 
Book
BookBook
Book
luis_lmro
 
Orsiso
OrsisoOrsiso
Orsiso
e27
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介
Kiyotaka Oku
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
DEVTYPE
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
Kent Ohashi
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.
Kuldeep Jain
 

What's hot (20)

TDC2016SP - Trilha .NET
TDC2016SP - Trilha .NETTDC2016SP - Trilha .NET
TDC2016SP - Trilha .NET
 
13 networking, mobile services, and authentication
13   networking, mobile services, and authentication13   networking, mobile services, and authentication
13 networking, mobile services, and authentication
 
Java VS Python
Java VS PythonJava VS Python
Java VS Python
 
Why Learn Python?
Why Learn Python?Why Learn Python?
Why Learn Python?
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
 
Networking Core Concept
Networking Core ConceptNetworking Core Concept
Networking Core Concept
 
Java весна 2013 лекция 2
Java весна 2013 лекция 2Java весна 2013 лекция 2
Java весна 2013 лекция 2
 
MQTT and Java - Client and Broker Examples
MQTT and Java - Client and Broker ExamplesMQTT and Java - Client and Broker Examples
MQTT and Java - Client and Broker Examples
 
The state of your own hypertext preprocessor
The state of your own hypertext preprocessorThe state of your own hypertext preprocessor
The state of your own hypertext preprocessor
 
Pre zen ta sion
Pre zen ta sionPre zen ta sion
Pre zen ta sion
 
Jason parsing
Jason parsingJason parsing
Jason parsing
 
Lexical environment in ecma 262 5
Lexical environment in ecma 262 5Lexical environment in ecma 262 5
Lexical environment in ecma 262 5
 
The Ring programming language version 1.5.4 book - Part 44 of 185
The Ring programming language version 1.5.4 book - Part 44 of 185The Ring programming language version 1.5.4 book - Part 44 of 185
The Ring programming language version 1.5.4 book - Part 44 of 185
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
Book
BookBook
Book
 
Orsiso
OrsisoOrsiso
Orsiso
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.
 

Similar to Multi client

Laporan multi client
Laporan multi clientLaporan multi client
Laporan multi client
ichsanbarokah
 
Hi, I need some one to help me with Design a client-server Chat so.pdf
Hi, I need some one to help me with Design a client-server Chat so.pdfHi, I need some one to help me with Design a client-server Chat so.pdf
Hi, I need some one to help me with Design a client-server Chat so.pdf
fashiongallery1
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
Sivadon Chaisiri
 
Note Use Java Write a web server that is capable of processing only.pdf
Note Use Java Write a web server that is capable of processing only.pdfNote Use Java Write a web server that is capable of processing only.pdf
Note Use Java Write a web server that is capable of processing only.pdf
fatoryoutlets
 
Pemrograman Jaringan
Pemrograman JaringanPemrograman Jaringan
Pemrograman Jaringan
belajarkomputer
 
Arduino and the real time web
Arduino and the real time webArduino and the real time web
Arduino and the real time web
Andrew Fisher
 
Codable routing
Codable routingCodable routing
Codable routing
Pushkar Kulkarni
 
Ppt of socket
Ppt of socketPpt of socket
Ppt of socket
Amandeep Kaur
 
Ipc
IpcIpc
JavaExamples
JavaExamplesJavaExamples
JavaExamples
Suman Astani
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
Frank Lyaruu
 
Socket Programming it-slideshares.blogspot.com
Socket  Programming it-slideshares.blogspot.comSocket  Programming it-slideshares.blogspot.com
Socket Programming it-slideshares.blogspot.com
phanleson
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
Yakov Fain
 
Networking & Socket Programming In Java
Networking & Socket Programming In JavaNetworking & Socket Programming In Java
Networking & Socket Programming In Java
Ankur Agrawal
 
Java 1
Java 1Java 1
Web
WebWeb
Web
googli
 
Baocao Web Tech Java Mail
Baocao Web Tech Java MailBaocao Web Tech Java Mail
Baocao Web Tech Java Mail
xicot
 
香港六合彩 &raquo; SlideShare
香港六合彩 &raquo; SlideShare香港六合彩 &raquo; SlideShare
香港六合彩 &raquo; SlideShare
biyu
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
Soumya Behera
 
ikh331-06-distributed-programming
ikh331-06-distributed-programmingikh331-06-distributed-programming
ikh331-06-distributed-programming
Anung Ariwibowo
 

Similar to Multi client (20)

Laporan multi client
Laporan multi clientLaporan multi client
Laporan multi client
 
Hi, I need some one to help me with Design a client-server Chat so.pdf
Hi, I need some one to help me with Design a client-server Chat so.pdfHi, I need some one to help me with Design a client-server Chat so.pdf
Hi, I need some one to help me with Design a client-server Chat so.pdf
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
 
Note Use Java Write a web server that is capable of processing only.pdf
Note Use Java Write a web server that is capable of processing only.pdfNote Use Java Write a web server that is capable of processing only.pdf
Note Use Java Write a web server that is capable of processing only.pdf
 
Pemrograman Jaringan
Pemrograman JaringanPemrograman Jaringan
Pemrograman Jaringan
 
Arduino and the real time web
Arduino and the real time webArduino and the real time web
Arduino and the real time web
 
Codable routing
Codable routingCodable routing
Codable routing
 
Ppt of socket
Ppt of socketPpt of socket
Ppt of socket
 
Ipc
IpcIpc
Ipc
 
JavaExamples
JavaExamplesJavaExamples
JavaExamples
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Socket Programming it-slideshares.blogspot.com
Socket  Programming it-slideshares.blogspot.comSocket  Programming it-slideshares.blogspot.com
Socket Programming it-slideshares.blogspot.com
 
Speed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSocketsSpeed up your Web applications with HTML5 WebSockets
Speed up your Web applications with HTML5 WebSockets
 
Networking & Socket Programming In Java
Networking & Socket Programming In JavaNetworking & Socket Programming In Java
Networking & Socket Programming In Java
 
Java 1
Java 1Java 1
Java 1
 
Web
WebWeb
Web
 
Baocao Web Tech Java Mail
Baocao Web Tech Java MailBaocao Web Tech Java Mail
Baocao Web Tech Java Mail
 
香港六合彩 &raquo; SlideShare
香港六合彩 &raquo; SlideShare香港六合彩 &raquo; SlideShare
香港六合彩 &raquo; SlideShare
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
 
ikh331-06-distributed-programming
ikh331-06-distributed-programmingikh331-06-distributed-programming
ikh331-06-distributed-programming
 

Recently uploaded

一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
bopyb
 
My burning issue is homelessness K.C.M.O.
My burning issue is homelessness K.C.M.O.My burning issue is homelessness K.C.M.O.
My burning issue is homelessness K.C.M.O.
rwarrenll
 
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
74nqk8xf
 
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
g4dpvqap0
 
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
74nqk8xf
 
University of New South Wales degree offer diploma Transcript
University of New South Wales degree offer diploma TranscriptUniversity of New South Wales degree offer diploma Transcript
University of New South Wales degree offer diploma Transcript
soxrziqu
 
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
Timothy Spann
 
End-to-end pipeline agility - Berlin Buzzwords 2024
End-to-end pipeline agility - Berlin Buzzwords 2024End-to-end pipeline agility - Berlin Buzzwords 2024
End-to-end pipeline agility - Berlin Buzzwords 2024
Lars Albertsson
 
State of Artificial intelligence Report 2023
State of Artificial intelligence Report 2023State of Artificial intelligence Report 2023
State of Artificial intelligence Report 2023
kuntobimo2016
 
Palo Alto Cortex XDR presentation .......
Palo Alto Cortex XDR presentation .......Palo Alto Cortex XDR presentation .......
Palo Alto Cortex XDR presentation .......
Sachin Paul
 
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
nyfuhyz
 
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
74nqk8xf
 
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
Timothy Spann
 
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
v7oacc3l
 
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
Aggregage
 
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
sameer shah
 
Learn SQL from basic queries to Advance queries
Learn SQL from basic queries to Advance queriesLearn SQL from basic queries to Advance queries
Learn SQL from basic queries to Advance queries
manishkhaire30
 
一比一原版(UO毕业证)渥太华大学毕业证如何办理
一比一原版(UO毕业证)渥太华大学毕业证如何办理一比一原版(UO毕业证)渥太华大学毕业证如何办理
一比一原版(UO毕业证)渥太华大学毕业证如何办理
aqzctr7x
 
The Ipsos - AI - Monitor 2024 Report.pdf
The  Ipsos - AI - Monitor 2024 Report.pdfThe  Ipsos - AI - Monitor 2024 Report.pdf
The Ipsos - AI - Monitor 2024 Report.pdf
Social Samosa
 
Everything you wanted to know about LIHTC
Everything you wanted to know about LIHTCEverything you wanted to know about LIHTC
Everything you wanted to know about LIHTC
Roger Valdez
 

Recently uploaded (20)

一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
一比一原版(GWU,GW文凭证书)乔治·华盛顿大学毕业证如何办理
 
My burning issue is homelessness K.C.M.O.
My burning issue is homelessness K.C.M.O.My burning issue is homelessness K.C.M.O.
My burning issue is homelessness K.C.M.O.
 
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
一比一原版(Coventry毕业证书)考文垂大学毕业证如何办理
 
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
一比一原版(爱大毕业证书)爱丁堡大学毕业证如何办理
 
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
一比一原版(牛布毕业证书)牛津布鲁克斯大学毕业证如何办理
 
University of New South Wales degree offer diploma Transcript
University of New South Wales degree offer diploma TranscriptUniversity of New South Wales degree offer diploma Transcript
University of New South Wales degree offer diploma Transcript
 
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Dat...
 
End-to-end pipeline agility - Berlin Buzzwords 2024
End-to-end pipeline agility - Berlin Buzzwords 2024End-to-end pipeline agility - Berlin Buzzwords 2024
End-to-end pipeline agility - Berlin Buzzwords 2024
 
State of Artificial intelligence Report 2023
State of Artificial intelligence Report 2023State of Artificial intelligence Report 2023
State of Artificial intelligence Report 2023
 
Palo Alto Cortex XDR presentation .......
Palo Alto Cortex XDR presentation .......Palo Alto Cortex XDR presentation .......
Palo Alto Cortex XDR presentation .......
 
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
一比一原版(UMN文凭证书)明尼苏达大学毕业证如何办理
 
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
一比一原版(Chester毕业证书)切斯特大学毕业证如何办理
 
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
06-12-2024-BudapestDataForum-BuildingReal-timePipelineswithFLaNK AIM
 
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
在线办理(英国UCA毕业证书)创意艺术大学毕业证在读证明一模一样
 
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
Beyond the Basics of A/B Tests: Highly Innovative Experimentation Tactics You...
 
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
STATATHON: Unleashing the Power of Statistics in a 48-Hour Knowledge Extravag...
 
Learn SQL from basic queries to Advance queries
Learn SQL from basic queries to Advance queriesLearn SQL from basic queries to Advance queries
Learn SQL from basic queries to Advance queries
 
一比一原版(UO毕业证)渥太华大学毕业证如何办理
一比一原版(UO毕业证)渥太华大学毕业证如何办理一比一原版(UO毕业证)渥太华大学毕业证如何办理
一比一原版(UO毕业证)渥太华大学毕业证如何办理
 
The Ipsos - AI - Monitor 2024 Report.pdf
The  Ipsos - AI - Monitor 2024 Report.pdfThe  Ipsos - AI - Monitor 2024 Report.pdf
The Ipsos - AI - Monitor 2024 Report.pdf
 
Everything you wanted to know about LIHTC
Everything you wanted to know about LIHTCEverything you wanted to know about LIHTC
Everything you wanted to know about LIHTC
 

Multi client

  • 1. MEMBUAT PROGRAM MULTICLIENT CHATTING CLIENT-SERVER MENGGUNAKAN BAHASA PEMROGRAMAN JAVA BERBASIS GRAFIS Oleh : AINI MAISI (0611 3070 1291) 6CD JURUSAN TEKNIK KOMPUTER POLITEKNIK NEGERI SRIWIJAYA PALEMBANG
  • 2. MEMBUAT PROGRAM MULTICLIENT CHATTING CLIENT-SERVER MENGGUNAKAN BAHASA PEMROGRAMAN JAVA BERBASIS GRAFIS 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. Dengan Chatting memungkinkan kita untuk selalu bisa berkomunikasi walaupun kita tidak berada bersamanya di suatu tempat. Aplikasi chatting merupakan suatu aplikasi yang memungkinkan pengguna (client) berkomunikasi teks secara langsung (Real Time) dengan pengguna lain dengan menggunakan media yang ada. Pada bagian ini, saya akan membuat aplikasi chatting berbasis grafis (seperti tampilan foto) menggunakan bahasa pemograman java. pertama yang harus dilakukan adalah menyetting alamat IP pada masing-masing PC. Kita menggunakan satu server dan satu client. Pertama yang harus dilakukan kita terlebih dahulu melakukan setting alamat IP pada masing-masing client. 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. Berikut adalah listing program MultiClient Chatting Client-Server berbasis grafis (gambar)  ChatServer.java import java.io.*; import java.net.*; import java.util.*; public class ChatServer { private static int uniqueId; private ArrayList<ChatServer.ClientThread> clients; private int port;
  • 3. private boolean keepGoing; public ChatServer() { this.port = 9999; clients = new ArrayList(); } public void start() { keepGoing = 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 { serverSocket.close(); for (int i = 0; i < clients.size(); ++i) { ChatServer.ClientThread tc = clients.get(i);
  • 4. 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."); } } }
  • 5. private String getClients() { String s = ""; for (ClientThread clientThread : clients) { s += clientThread.username + ":"; } s += "---"; System.out.println(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;
  • 6. 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) {
  • 7. 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 "postText": response = "recieveText~" + pengirim + "~" + text + "~" + kepada + "~n"; send(response); break; case "postPrivateText": response = "recievePrivateText~" + pengirim + "~" + text + "~" + kepada + "~n"; send(response); break; case "login":
  • 8. response = "login~" + pengirim + "~" + text + "~" + kepada + "~n"; send(response); break; case "logout": response = "logout~" + pengirim + "~" + text + "~" + kepada + "~n"; send(response); break; case "list": response = "list~server~" + getClients() + "~ ~ ~ ~ ~n"; send(response); break; } } remove(id); close(); } private void close() { try { if (sOutput != null) { sOutput.close(); } } catch (Exception e) { } try {
  • 9. 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(); return false; } try { sOutput.writeObject(msg); } catch (IOException e) { System.out.println("Error sending message to " + username); System.out.println(e.toString()); } return true; } }
  • 10. }  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() {
  • 11. 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();
  • 12. 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.SEVERE, null, ex); } try { if (input != null) { input.close();
  • 13. } } catch (Exception e) { } try { if (output != null) { output.close(); } } catch (Exception e) { } try { if (socket != null) { socket.close(); } } 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() {
  • 14. 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("E:/rara.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);
  • 15. postTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { postTextFieldActionPerformed(evt); } }); kirimButton.setText("Kirim"); kirimButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { kirimButtonActionPerformed(evt); } }); jLabel2.setText("Server"); serverTextField.setText("10.17.0.0"); jLabel3.setText("Port"); portTextField.setText("9999"); masukButton.setText("Masuk"); masukButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { masukButtonActionPerformed(evt);
  • 16. } }); jLabel4.setText("Username"); usernameTextField.setText("Rara Ariesta"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(postTextField) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addComponent(kirimButton)) .addComponent(jScrollPane1))
  • 17. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .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.RELATE D) .addComponent(serverTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addComponent(portTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addComponent(usernameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addComponent(masukButton))) .addContainerGap())
  • 18. ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align ment.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(usernameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)
  • 19. .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATE D) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Align ment.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 {
  • 20. 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.ActionEvent evt) { // TODO add your handling code here: kirimButtonActionPerformed(evt); } /** * @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/lookandfeel/pla f.html */ try {
  • 21. 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() { @Override public void run() {
  • 22. 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 { @Override public void run() { while (true) { try { String msg = (String) input.readObject();
  • 23. String res; String type = msg.split("~")[0]; String pengirim = 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": res = pengirim + ": " + text; if (kepada.equals(username)) { viewTextArea.setText(viewTextArea.getText() + res + "n"); } break; case "login": viewTextArea.setText(viewTextArea.getText() + pengirim + " sudah login..." + "n"); clients.add(pengirim); break; case "logout": viewTextArea.setText(viewTextArea.getText() + pengirim + " telah logout..." + "n"); clients.remove(pengirim); break; case "list":
  • 24. 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)); } } } Pastikan kita sudah terhubung ke internet. Lalu eksekusi program menggunakan ctrl+1 dan ctrl+2, maka tampilan akan seperti berikut: