Laporan multiclient chatting berbasis grafis (gambar)

25
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

Transcript of Laporan multiclient chatting berbasis grafis (gambar)

Page 1: Laporan multiclient chatting berbasis grafis (gambar)

TUGAS

Membuat Program MultiClient Chatting Client-ServerMenggunakan Bahasa Pemrograman Java Berbasis Grafis

Oleh :

Rara Ariesta Priliani

(061130701307)

6CD

JURUSAN TEKNIK KOMPUTER

POLITEKNIK NEGERI SRIWIJAYA

PALEMBANG

Page 2: Laporan multiclient chatting berbasis grafis (gambar)

Chatting memungkinkan kita untuk selalu bisa berkomunikasiwalaupun kita tidak berada bersamanya di suatu tempat. Aplikasi chattingmerupakan suatu aplikasi yang memungkinkan pengguna (client)berkomunikasi teks secara langsung (Real Time) dengan pengguna lain denganmenggunakan media yang ada.

Java merupakan suatu bahasa pemograman yang multi platform danmulti device. Java juga merupakan bahasa pemograman yang berorientasi objekdan program java tersusun dari bagian yang disebut kelas.

Pada bagian ini, saya akan membuat aplikasi chatting berbasis grafis (sepertitampilan foto) menggunakan bahasa pemograman java. pertama yang harusdilakukan adalah menyetting alamat IP pada masing-masing PC. Kita menggunakansatu server dan satu client.

Pertama yang harus dilakukan kita terlebih dahulu melakukan settingalamat IP pada masing-masing client. Setelah melakukan konfigurasi IP padamasing-masingi komputer kemudian kita juga harus memastikan bahwa firewallpada masing-masing komputer harus diaktifkan karena pada beberapa kasus programini tidak dapat saling terkoneksi akibat firewall yang aktif pada sistem operasinya.

Berikut adalah listing program MultiClient Chatting Client-Serverberbasis 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;

Page 3: Laporan multiclient chatting berbasis grafis (gambar)

clients = new ArrayList();

}

public void start() {

keepGoing = true;

try {

ServerSocket serverSocket = new ServerSocket(port);

while (keepGoing) {

System.out.println("ChatServer waiting for Clientson port " + port + ".");

Socket socket = serverSocket.accept();

if (!keepGoing) {

break;

}

ChatServer.ClientThread t = newChatServer.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();

Page 4: Laporan multiclient chatting berbasis grafis (gambar)

} catch (IOException ioE) {

}

}

} catch (Exception e) {

System.out.println("Exception closing the serverand 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 + ":";

Page 5: Laporan multiclient chatting berbasis grafis (gambar)

}

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;

Page 6: Laporan multiclient chatting berbasis grafis (gambar)

public ClientThread(Socket socket) {

id = ++uniqueId;

this.socket = socket;

System.out.println("Menciptakan Object Input/OutputStreams");

try {

sOutput = newObjectOutputStream(socket.getOutputStream());

sInput = newObjectInputStream(socket.getInputStream());

String message = (String) sInput.readObject();

username = message.split("~")[1];

System.out.println(username + " masuk.");

} catch (IOException e) {

System.out.println("Exception creating newInput/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) {

Page 7: Laporan multiclient chatting berbasis grafis (gambar)

System.out.println(username + " Exceptionreading 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":

Page 8: Laporan multiclient chatting berbasis grafis (gambar)

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) {

}

Page 9: Laporan multiclient chatting berbasis grafis (gambar)

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;

Page 10: Laporan multiclient chatting berbasis grafis (gambar)

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();

}

Page 11: Laporan multiclient chatting berbasis grafis (gambar)

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 = newObjectInputStream(socket.getInputStream());

output = newObjectOutputStream(socket.getOutputStream());

} catch (IOException eIO) {

System.out.println("Exception creating newInput/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");

Page 12: Laporan multiclient chatting berbasis grafis (gambar)

} 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) {

Page 13: Laporan multiclient chatting berbasis grafis (gambar)

output.close();

}

} catch (Exception e) {

}

try {

if (socket != null) {

socket.close();

}

} catch (Exception e) {

}

}

/**

* This method is called from within the constructor toinitialize the form.

* WARNING: Do NOT modify this code. The content of thismethod is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="GeneratedCode">

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();

Page 14: Laporan multiclient chatting berbasis grafis (gambar)

kirimButton = new javax.swing.JButton();

lbljpg = new javax.swing.JLabel(newImageIcon("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(newjava.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEventevt) {

postTextFieldActionPerformed(evt);

}

Page 15: Laporan multiclient chatting berbasis grafis (gambar)

});

kirimButton.setText("Kirim");

kirimButton.addActionListener(newjava.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEventevt) {

kirimButtonActionPerformed(evt);

}

});

jLabel2.setText("Server");

serverTextField.setText("10.17.0.0");

jLabel3.setText("Port");

portTextField.setText("9999");

masukButton.setText("Masuk");

masukButton.addActionListener(newjava.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEventevt) {

masukButtonActionPerformed(evt);

}

});

jLabel4.setText("Username");

Page 16: Laporan multiclient chatting berbasis grafis (gambar)

usernameTextField.setText("Rara Ariesta");

javax.swing.GroupLayout layout = newjavax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()

.addComponent(postTextField)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(kirimButton))

.addComponent(jScrollPane1))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jScrollPane2,javax.swing.GroupLayout.PREFERRED_SIZE, 259,javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

Page 17: Laporan multiclient chatting berbasis grafis (gambar)

.addComponent(lbljpg)

.addComponent(jLabel2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(serverTextField,javax.swing.GroupLayout.PREFERRED_SIZE, 167,javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(portTextField,javax.swing.GroupLayout.PREFERRED_SIZE, 46,javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel4)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(usernameTextField,javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(masukButton)))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()

Page 18: Laporan multiclient chatting berbasis grafis (gambar)

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(lbljpg)

.addComponent(jLabel2)

.addComponent(serverTextField,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel3)

.addComponent(portTextField,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(masukButton)

.addComponent(jLabel4)

.addComponent(usernameTextField,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2,javax.swing.GroupLayout.Alignment.TRAILING,javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)

.addGroup(layout.createSequentialGroup()

.addComponent(jScrollPane1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

Page 19: Laporan multiclient chatting berbasis grafis (gambar)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(postTextField,javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(kirimButton))))

.addContainerGap())

);

pack();

}// </editor-fold>

private voidmasukButtonActionPerformed(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 voidkirimButtonActionPerformed(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("");

Page 20: Laporan multiclient chatting berbasis grafis (gambar)

} catch (IOException ex) {

Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE,null, ex);

}

}

private voidpostTextFieldActionPerformed(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 andfeel setting code (optional) ">

/* If Nimbus (introduced in Java SE 6) is not available,stay with the default look and feel.

* For details seehttp://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info :javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

Page 21: Laporan multiclient chatting berbasis grafis (gambar)

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);

}

});

}

Page 22: Laporan multiclient chatting berbasis grafis (gambar)

// 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];

Page 23: Laporan multiclient chatting berbasis grafis (gambar)

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 + " sudahlogin..." + "\n");

clients.add(pengirim);

break;

case "logout":

viewTextArea.setText(viewTextArea.getText() + pengirim + " telahlogout..." + "\n");

clients.remove(pengirim);

break;

case "list":

setTable(text);

break;

}

} catch (IOException e) {

Page 24: Laporan multiclient chatting berbasis grafis (gambar)

System.out.println("Server has close theconnection: " + 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 programmenggunakan ctrl+1 dan ctrl+2, maka tampilan akan seperti berikut:

Page 25: Laporan multiclient chatting berbasis grafis (gambar)