SlideShare a Scribd company logo
TUGAS
Membuat Program MultiClient Chatting Client-Server
Menggunakan Bahasa Pemrograman Java Berbasis Grafis
Oleh :
Rara Ariesta Priliani
(061130701307)
6CD
JURUSAN TEKNIK KOMPUTER
POLITEKNIK NEGERI SRIWIJAYA
PALEMBANG
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.
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.
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:
Laporan multiclient chatting berbasis grafis (gambar)

More Related Content

PDF
MultiClient chatting berbasis gambar
yoyomay93
 
PDF
Multi client
Aisy Cuyy
 
DOCX
Multi client
ganteng8
 
PDF
Laporan multiclient chatting client server
trilestari08
 
PPT
Network
phanleson
 
PPTX
Java весна 2013 лекция 2
Technopark
 
PPTX
13 networking, mobile services, and authentication
WindowsPhoneRocks
 
PPT
Networking Core Concept
Rays Technologies
 
MultiClient chatting berbasis gambar
yoyomay93
 
Multi client
Aisy Cuyy
 
Multi client
ganteng8
 
Laporan multiclient chatting client server
trilestari08
 
Network
phanleson
 
Java весна 2013 лекция 2
Technopark
 
13 networking, mobile services, and authentication
WindowsPhoneRocks
 
Networking Core Concept
Rays Technologies
 

What's hot (20)

PDF
The Ring programming language version 1.7 book - Part 7 of 196
Mahmoud Samir Fayed
 
PPT
Orsiso
e27
 
PPTX
TDC2016SP - Trilha .NET
tdc-globalcode
 
PPTX
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
tdc-globalcode
 
DOCX
Chatting dengan beberapa pc laptop
yayaria
 
PDF
Chat application in java using swing and socket programming.
Kuldeep Jain
 
DOCX
201913046 wahyu septiansyah network programing
wahyuseptiansyah
 
PDF
Jason parsing
parallelminder
 
PDF
Grails/Groovyによる開発事例紹介
Kiyotaka Oku
 
ODP
MQTT and Java - Client and Broker Examples
Micha Kops
 
PDF
soft-shake.ch - Java SE 7: The Fork/Join Framework and Project Coin
soft-shake.ch
 
ODT
Java practical
william otto
 
PDF
4Developers: Michał Szczepanik- Kotlin - Let’s ketchup it
PROIDEA
 
PDF
Java 7 LavaJUG
julien.ponge
 
TXT
Play image
Fardian Syah
 
PDF
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
 
PDF
5. Ввод-вывод, доступ к файловой системе
DEVTYPE
 
PDF
4Developers: Dominik Przybysz- Message Brokers
PROIDEA
 
PPTX
Lexical environment in ecma 262 5
Kim Hunmin
 
PPTX
#ITsubbotnik Spring 2017: Roman Iovlev "Java edge in test automation"
epamspb
 
The Ring programming language version 1.7 book - Part 7 of 196
Mahmoud Samir Fayed
 
Orsiso
e27
 
TDC2016SP - Trilha .NET
tdc-globalcode
 
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
tdc-globalcode
 
Chatting dengan beberapa pc laptop
yayaria
 
Chat application in java using swing and socket programming.
Kuldeep Jain
 
201913046 wahyu septiansyah network programing
wahyuseptiansyah
 
Jason parsing
parallelminder
 
Grails/Groovyによる開発事例紹介
Kiyotaka Oku
 
MQTT and Java - Client and Broker Examples
Micha Kops
 
soft-shake.ch - Java SE 7: The Fork/Join Framework and Project Coin
soft-shake.ch
 
Java practical
william otto
 
4Developers: Michał Szczepanik- Kotlin - Let’s ketchup it
PROIDEA
 
Java 7 LavaJUG
julien.ponge
 
Play image
Fardian Syah
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
 
5. Ввод-вывод, доступ к файловой системе
DEVTYPE
 
4Developers: Dominik Przybysz- Message Brokers
PROIDEA
 
Lexical environment in ecma 262 5
Kim Hunmin
 
#ITsubbotnik Spring 2017: Roman Iovlev "Java edge in test automation"
epamspb
 
Ad

Similar to Laporan multiclient chatting berbasis grafis (gambar) (20)

DOCX
Laporan multi client
ichsanbarokah
 
PDF
Server1
FahriIrawan3
 
PDF
Hi, I need some one to help me with Design a client-server Chat so.pdf
fashiongallery1
 
DOCX
Laporan tugas network programming
RahmatHamdani2
 
PDF
Tugas 2
Novi_Wahyuni
 
PDF
201913001 khairunnisa progres_harian
KhairunnisaPekanbaru
 
DOCX
Fia fabila
fiafabila
 
PPT
Pemrograman Jaringan
belajarkomputer
 
PDF
Advanced Java Practical File
Soumya Behera
 
PDF
Chat Room System using Java Swing
Tejas Garodia
 
PDF
Mobile Programming - Network Universitas Budi Luhur
Riza Fahmi
 
PDF
ikh331-06-distributed-programming
Anung Ariwibowo
 
PPT
Chapter 4 slides
lara_ays
 
PPT
Multi user chat system using java
Akhil Goutham Kotini
 
PDF
networks-lab-excercise4.pdf
Jayaprasanna4
 
PDF
Creating a Whatsapp Clone - Part II.pdf
ShaiAlmog1
 
PPTX
Client server chat application
Samsil Arefin
 
PPT
Socket Programming
Sivadon Chaisiri
 
PPTX
#3 (Multi Threads With TCP)
Ghadeer AlHasan
 
PDF
java sockets
Enam Ahmed Shahaz
 
Laporan multi client
ichsanbarokah
 
Server1
FahriIrawan3
 
Hi, I need some one to help me with Design a client-server Chat so.pdf
fashiongallery1
 
Laporan tugas network programming
RahmatHamdani2
 
Tugas 2
Novi_Wahyuni
 
201913001 khairunnisa progres_harian
KhairunnisaPekanbaru
 
Fia fabila
fiafabila
 
Pemrograman Jaringan
belajarkomputer
 
Advanced Java Practical File
Soumya Behera
 
Chat Room System using Java Swing
Tejas Garodia
 
Mobile Programming - Network Universitas Budi Luhur
Riza Fahmi
 
ikh331-06-distributed-programming
Anung Ariwibowo
 
Chapter 4 slides
lara_ays
 
Multi user chat system using java
Akhil Goutham Kotini
 
networks-lab-excercise4.pdf
Jayaprasanna4
 
Creating a Whatsapp Clone - Part II.pdf
ShaiAlmog1
 
Client server chat application
Samsil Arefin
 
Socket Programming
Sivadon Chaisiri
 
#3 (Multi Threads With TCP)
Ghadeer AlHasan
 
java sockets
Enam Ahmed Shahaz
 
Ad

Recently uploaded (20)

PPTX
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PPTX
Can You Build Dashboards Using Open Source Visualization Tool.pptx
Varsha Nayak
 
DOCX
Can You Build Dashboards Using Open Source Visualization Tool.docx
Varsha Nayak
 
PDF
Adobe Illustrator Crack Full Download (Latest Version 2025) Pre-Activated
imang66g
 
PPTX
Presentation about variables and constant.pptx
safalsingh810
 
PDF
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
PDF
Jenkins: An open-source automation server powering CI/CD Automation
SaikatBasu37
 
PDF
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
PPTX
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
PDF
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
PDF
Protecting the Digital World Cyber Securit
dnthakkar16
 
PDF
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
PDF
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
PDF
Bandai Playdia The Book - David Glotz
BluePanther6
 
PDF
Exploring AI Agents in Process Industries
amoreira6
 
PPTX
Presentation about variables and constant.pptx
kr2589474
 
PPTX
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
PDF
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
PPTX
The-Dawn-of-AI-Reshaping-Our-World.pptxx
parthbhanushali307
 
PPTX
Explanation about Structures in C language.pptx
Veeral Rathod
 
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
Can You Build Dashboards Using Open Source Visualization Tool.pptx
Varsha Nayak
 
Can You Build Dashboards Using Open Source Visualization Tool.docx
Varsha Nayak
 
Adobe Illustrator Crack Full Download (Latest Version 2025) Pre-Activated
imang66g
 
Presentation about variables and constant.pptx
safalsingh810
 
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
Jenkins: An open-source automation server powering CI/CD Automation
SaikatBasu37
 
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
Protecting the Digital World Cyber Securit
dnthakkar16
 
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
Bandai Playdia The Book - David Glotz
BluePanther6
 
Exploring AI Agents in Process Industries
amoreira6
 
Presentation about variables and constant.pptx
kr2589474
 
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
The-Dawn-of-AI-Reshaping-Our-World.pptxx
parthbhanushali307
 
Explanation about Structures in C language.pptx
Veeral Rathod
 

Laporan multiclient chatting berbasis grafis (gambar)

  • 1. TUGAS Membuat Program MultiClient Chatting Client-Server Menggunakan Bahasa Pemrograman Java Berbasis Grafis Oleh : Rara Ariesta Priliani (061130701307) 6CD JURUSAN TEKNIK KOMPUTER POLITEKNIK NEGERI SRIWIJAYA PALEMBANG
  • 2. 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. 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. 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;
  • 3. 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();
  • 4. } 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 + ":";
  • 5. } 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;
  • 6. 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) {
  • 7. 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":
  • 8. 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) { }
  • 9. 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;
  • 10. 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(); }
  • 11. 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");
  • 12. } 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) {
  • 13. 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();
  • 14. 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); }
  • 15. }); 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");
  • 16. 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()
  • 17. .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()
  • 18. .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)
  • 19. .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("");
  • 20. } 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());
  • 21. 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); } }); }
  • 22. // 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];
  • 23. 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) {
  • 24. 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: