0% menganggap dokumen ini bermanfaat (0 suara)
84 tayangan11 halaman

Modul 8 Pemrograman Klien-Server Multithreading

Modul ini membahas tentang pemrograman klien-server multithreading pada ServerSocket di Java. Secara ringkas, modul ini menjelaskan konsep dasar multithreading dan keuntungan menggunakannya, serta memberikan contoh kode program multithreading menggunakan interface Runnable dan menurunkan kelas Thread. Modul ini juga mendemonstrasikan penerapan multithreading pada server dengan membuat thread baru untuk setiap koneksi klien agar server dapat melayani beberapa klien se

Diunggah oleh

Sutan Pasha
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
84 tayangan11 halaman

Modul 8 Pemrograman Klien-Server Multithreading

Modul ini membahas tentang pemrograman klien-server multithreading pada ServerSocket di Java. Secara ringkas, modul ini menjelaskan konsep dasar multithreading dan keuntungan menggunakannya, serta memberikan contoh kode program multithreading menggunakan interface Runnable dan menurunkan kelas Thread. Modul ini juga mendemonstrasikan penerapan multithreading pada server dengan membuat thread baru untuk setiap koneksi klien agar server dapat melayani beberapa klien se

Diunggah oleh

Sutan Pasha
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 11

MODUL 8

PEMROGRAMAN KLIEN-SERVER MULTITHREADING


PADA SERVERSOCKET

CAPAIAN PEMBELAJARAN

1. Mampu mengimplementasikan aplikasi multi-threading dan membuat server


yang dapat menangani lebih dari 1 koneksi atau banyak klien pada saat yang
sama.

KEBUTUHAN ALAT/BAHAN/SOFTWARE

1. Netbeans IDE 8.0.1


2. Java: 1.7.0_67

DASAR TEORI

Pemrograman multithreading merupakan salah satu fitur dalam bahasa Java,


multithreading merupakan sebuah konsep untuk dapat menjalankan task atau
tugas lebih dari satu secara paralel, sehingga dengan konsep ini task yang banyak
akan cepat selesai karena tidak saling tunggu untuk menyelesaikan task. Selain
itu dengan menggunakan konsep multithreading kita benar-benar akan
memanfaatkan semua core yang ada dalam prosesor.
Sebelum ke dalam bahasa pemrograman, konsep multithreading sudah lebih dulu
diterapkan dalam sebuah sistem operasi. Misalkan unix/linux, windows atau sistem
operasi lain. Contoh multithreading yang sudah kita rasakan adalah browser,
ketika menggunakan browser kita bisa new tab atau new window lebih dari satu.
Selain itu kita juga bisa download ketika sedang browsing, bayangkan aja ketika
kita ingin menambah tab baru atau window tetapi harus menutup tab atau window
sebelumnya terlebih dahulu. Atau ketika akan download kita tidak melakukan
aktifitas yang lain dengan browser kita, pastinya akan membosankan.

1
Thread merupakan sebuah bagian program yang bisa berjalan mandiri, sehingga
dua atau lebih thread dapat berjalan bersamaan, tanpa yang satu harus menunggu
selesainya yang lain. Jadi aplikasi bisa berjalan secara parallel. Thread adalah unit
terkecil dalam suatu proses yang bisa dijadwalkan oleh sistem operasi. Kadang
disebut sebagai proses ringan (lightweight).
Setiap bagian program bekerja sebagai bagian dari suatu thread. Setidaknya
dalam program stand-alone yang berjalan, terdapat sebuah thread, yaitu thread di
mana metode main() dipanggil.
Contoh threading:
o Sebuah program yang bisa menampilkan animasi sambil memproses data.
o Sebuah server game catur online yang bisa melayani beberapa pasang
user tanpa menunggu 1 pasang selesai bermain dulu.
o Program Word Processor bisa mengetik sambil melakukan pengecekan
kesalahan grammar, dan bisa sambil mengeprint juga.
Perbedaan Single-Threading dan Multi-Threading
 Single-Threading adalah sebuah lightweight process (proses sederhana)
yang mempunyai threadtunggal yang berfungsi sebagai pengendali/
controller.
 Multi-Threading adalah proses dengan thread yang banyak dan
mengerjakan lebih dari satu tugasdalam satu waktu.

Keuntungan Multi-Threading
1. Tanggap(responsive): Multi-Threading mengizinkan program untuk berjalan
terus walau-pun pada bagian program tersebut di block atau sedang dalam
keadaan menjalankan operasi yang lama/panjang. Sebagai contoh,
multithread web browser dapat mengizinkan pengguna berinteraksi dengan
suatu thread ketika suatu gambar sedang diload oleh thread yang lain.
2. Pembagian sumber daya: Secara default, thread membagi memori dan
sumber daya dari proses. Ketika thread berjalan pada data yang sama, thread
tersebut bisa berbagi cache memory.
3. Ekonomis: Mengalokasikan memori dan sumber daya untuk membuat proses
adalah sangat mahal. Alternatifnya, karena thread membagi sumber daya dari
proses, ini lebih ekonomis untuk membuat threads.

2
4. Pemberdayaan arsitektur multiprosesor: Keuntungan dari multi-threading
dapat ditingkatkan dengan arsitektur multiprosesor, dimana setiap thread
dapat jalan secara paralel pada prosesor yang berbeda. Pada arsitektur
prosesor tunggal, CPU biasanya berpindah-pindah antara setiap thread
dengan cepat, sehingga terdapat ilusi paralelisme, tetapi pada kenyataannya
hanya satu thread yang berjalan di setiap waktu.
Kerugian Multi-Threading
1. Multiple thread bisa mengganggu satu sama lain saat berbagi hardware
resource, misalnya chace memory.
2. Execution time (waktu proses) dari sebuah single-thread tidak dapat diimprove
(ditambah), tapi malah bisa diturunkan. Ini terjadi karena penurunan frequensi
yang dibutuhkan ketika terjadi pergantian thread yang berjalan.
3. Harus ada dukungan dari hardware ataupun software untuk melakukan multi-
Threading.
Thread dapat dibuat dengan salah satu dari dua cara berikut:
o Meng-extend java.lang.Thread
o Meng-implement java.lang.Runnable
Statement penting dalam thread:
o new (membuat sebuah thread).
o running ( instruksi yang sedang dieksekusi).
o waiting (thread menunggu sampai suatu event berjalan).
o ready (thread telah siap dijalankan dan menunggu waktu proses).
o terminated (thread selesai dieksekusi).
Method control thread:
o start() : untuk memulai eksekusi thread.
o stop() : untuk mengakhiri eksekusi thread.
o suspend() : untuk menghentikan sementara waktu.
o resume() : untuk menjalankan kembali thread yang di-suspend.
o sleep() : menghentikan thread sekian milidetik.

PRAKTIK

1. Thread dengan meng-implement java.lang.Runnable


Program berikut ini akan mendefinisikan sebuah kelas ThreadKu yang
menerapkan(meng-implement) interface pada java.lang.Runnable, dimana kode
program yang dijalankan adalah kode yang ada pada fungsi run(). Untuk
memanggil kelas Thread diawali dengan membuat objek dari kelas yang meng-
implement Runnable dengan perintah new ThreadKu(), dilanjutkan dengan
membuat objek dari kelas Thread dengan parameter dari objek kelas ThreadKu
yang telah dibuat, namun dalam program ini diwakili keyword this, untuk kemudian
dilanjutkan dengan pemanggilan fungsi start(), oleh objek Thread.
Pada program ini terdapat 2 Thread, yaitu threadUtama yang dihasilkan
oleh fungsi main pada kelas public MyThread dan thr yang diciptakan pada kelas
ThreadKu. Terdapat juga fungsi sleep() yang digunakan untuk menghentikan
Thread yang aktif selama n milidetik, untuk membuktikan kedua Thread dip roses
bergantian.
Berikut programnya:

3
class ThreadKu implements Runnable{
Thread thr;
public ThreadKu() {
thr = new Thread(this,"Contoh Thread");
System.out.println("Eksekusi ThreadKu = "+thr);
thr.start();
}
public void run(){
try {
for(int i = 1;i<=5;i++)
{
System.out.println("Ini ThreadKu yang ke " + i);
Thread.sleep(1000);
}
}
catch (InterruptedException ie)
{
System.out.println("ThreadKu diinterupsi");
}
System.out.println("ThreadKu selesai");}
}
public class MyThread {
public static void main (String[] args){
new ThreadKu();
System.out.println("Eksekusi ThreadUtama adalah sebagai
berikut:");
try {
for(int i=10; i>=1; i--)
{
System.out.println("Ini ThreadUtama yang ke " + i);
Thread.sleep(1000);
}
}
catch (InterruptedException ie)
{
System.out.println("ThreadUtama diinterupsi");
}
System.out.println("ThreadUtama selesai");
}
}
2. Thread dengan meng-extend java.lang.Thread
Program berikut ini akan mendefinisikan sebuah kelas MyThread2 yang meng-
extends kelas Thread, dimana pembuatan program multithreading dengan
menurunkan dari kelas Thread ini lebih sederhana, walaupun secara prinsip sama
dengan pembuatan program yang menerapkan interface Runnable.
public class MyThread2 extends Thread{
public MyThread2() {
}
public static void main(String[] args)
{
MyThread2 Thread1,Thread2;
Thread1 = new MyThread2();
Thread2 = new MyThread2();
Thread1.start();
Thread2.start();

4
}
public void run(){
int delay;
for(int i=1; i<=4; i++)
{
try
{
System.out.println(getName()+"Sedang dieksekusi..");
sleep (1000);
}
catch (InterruptedException interruptEx)
{
System.out.println(interruptEx);
}
}
}
}
3. Penerapan Multithreading pada ServerSocket
ProgramServerThread
Setelah kita lakukan praktek pemrograman multithreading diatas, berikutnya akan
kita lakukan teknik multithreading sehingga program Server yang sebelumnya
hanya dapat menerima 1 koneksi client untuk kemudian dijadikan dapat menerima
koneksi lebih dari satu client.
Dalam program ini disiapkan sebuah kelas yang diturunkan dari kelas
java.lang.Thread, yang akan dieksekusi oleh thread untuk melayani setiap koneksi
yang terbentuk dengan client secara terpisah, kelas ini diberi nama
InfoKoneksiClient (sebagai Server). Pada program utama (fungsi main()), akan
dilakukan perulangan secara terus menerus untuk memangil fungsi accept().
Ketika ada koneksi dari client terbentuk, program akan menjalankan thread dari
kelas InfoKoneksiClient dengan memberikan socket koneksinya, dengan demikian
setiap ada koneksi client baru terbentuk sebuah thread baru akan dijalankan.
Berikut programnya:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

class InfoKoneksiClient extends Thread{


private Socket serverSocket;
public InfoKoneksiClient(Socket sck)
{
serverSocket = sck;
}
public void run(){
BufferedReader inFromClient;
DataOutputStream outToClient;
String dataFromClient;
try {
inFromClient = new BufferedReader(new
InputStreamReader(serverSocket.getInputStream()) );

5
outToClient = new
DataOutputStream(serverSocket.getOutputStream());
outToClient.writeBytes("InfoServer versi0.1\n"+
"hanya untuk testing..\n"+
"Silahkan berikan perintah
TIME|NET|Quit\n");
boolean isQUIT = false;
while (!isQUIT)
{
dataFromClient = inFromClient.readLine();
if(dataFromClient.startsWith("TIME"))
{
outToClient.writeBytes(new
Date().toString()+"\n");
}
else if (dataFromClient.startsWith("NET"))
{
outToClient.writeBytes(InetAddress.getByName
("localhost").toString()+"\n");
}
else if(dataFromClient.startsWith("QUIT"))
{
isQUIT = true;
}
}
outToClient.close();
inFromClient.close();
serverSocket.close();
}
catch(IOException ioe)
{
System.out.println("Error:" +ioe);
}
catch(Exception e)
{
System.out.println("Error:" +e);
}
}
}
public class ProgramServerThread
{
private final static int NOMOR_PORT=1234;

public static void main(String[] args) {


// TODO code application logic here
try {
ServerSocket infoServer = new ServerSocket(NOMOR_PORT);
System.out.println("Server telah siap...!");
while(true){
Socket sock = infoServer.accept();
System.out.println("Ada client yang terkoneksi...!");
new InfoKoneksiClient(sock).start();
}
}
catch(Exception e){
System.out.println("Error:" +e);

6
}
}
}
ProgramClient
Untuk program client tidak perlu ada perubahan, karena mekanisme antara client
dan server tidak berubah sehingga programnya sama dengan yang ada di modul 7.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ProgramClient {


private final int NOMOR_PORT=1234;
private final String TARGET_HOST="localhost";
private final String QUIT="QUIT";
public ProgramClient(){
try{
BufferedReader inputDariUser = new BufferedReader
(new InputStreamReader(System.in) );
Socket clientSocket = new Socket(TARGET_HOST,NOMOR_PORT );
DataOutputStream outputKeServer =
new DataOutputStream(clientSocket.getOutputStream() );
BufferedReader inputDariServer = new BufferedReader
new InputStreamReader(clientSocket.getInputStream()) );
System.out.println(inputDariServer.readLine());
System.out.println(inputDariServer.readLine());
System.out.println(inputDariServer.readLine());

boolean isQUIT = false;


while (!isQUIT){
System.out.print("Perintah Anda :");
String cmd = inputDariUser.readLine();
cmd = cmd.toUpperCase();
if (cmd.equals(QUIT)){
isQUIT = true;
}
outputKeServer.writeBytes(cmd +"\n");
String result = inputDariServer.readLine();
System.out.println("Dari Server :"+ result);
}
outputKeServer.close();
inputDariServer.close();
clientSocket.close();
}
catch (IOException ioe){
System.out.println("Error:"+ioe);
}
catch (Exception e){
System.out.println("Error:"+e);
}
}
public static void main(String[] args) {
// TODO code application logic here
new ProgramClient();

7
}
}

Program Server
Server MultiEchoServer ini dapat menerima koneksi dan berinteraksi dengan
banyak client pada satu waktu.
/*
* Program MultiEchoServer
* server dengan fitur multithread menerima message dari client
* dan mengirimkannya kembali ke client
*/
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class MultiEchoServer {

private static ServerSocket serverSocket;


private static final int PORT = 5050;

public static void main(String[] args) throws IOException {


try {
serverSocket = new ServerSocket(PORT);
System.out.println("Server berjalan, menunggu
client...");
} catch (IOException ioEx) {
System.out.println("\nTidak dapat mensetup port!");
System.exit(1);
}
do {
//Menunggu koneksi dari client...
Socket client = serverSocket.accept();
System.out.println("\nClient baru diterima.\n");

//Buat thread untuk menangani komunikasi dengan client


ini
//lewatkan socket yang relevan ke contructor dari
thread ini
ClientHandler handler = new ClientHandler(client);
handler.start(); //menjalankan thread yang telah
dibuat
} while (true);
}
}

class ClientHandler extends Thread {

private Socket client;


private Scanner input;
private PrintWriter output;

public ClientHandler(Socket socket) {


//Set up referensi ke socket yang beraosiasi...
client = socket;
try {

8
input = new Scanner(client.getInputStream());
output = new PrintWriter(client.getOutputStream(),
true);
} catch (IOException ioEx) {
//ioEx.printStackTrace();
}
}

public void run() {


String received;

do {
//Terima pesan dari client pada input stream socket...
received = input.nextLine();
System.out.println(received);

//Echo-kan pesan kembali ke client pada stream output


socket...
output.println("[" + received + "]");

//Ulangi sampai client mengirimkan pesan 'QUIT'...


} while (!received.equals("QUIT"));

try {
if (client != null) {
System.out.println("Menutup koneksi...");
client.close();
}
} catch (IOException ioEx) {
System.out.println("Penutupan koneksi gagal!");
}
}
}

Program Klien
Sedangkan client untuk memanfaatkan server tersebut, pada kelas MultiEchoClient,
diperlihatkan pada kode berikut:
/*
* Program MultiEchoClient
* Digunakan untuk membangun koneksi ke server MultiEchoServer
* Mengirimkan pesan teks ke server dan menerima balasannya
*/
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class MultiEchoClient {


private static InetAddress host;
private static final int PORT = 5050;

public static void main(String[] args) {


try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException uhEx) {
System.out.println("\nHost ID tidak ditemukan!\n");

9
System.exit(1);
}
sendMessages();
}

private static void sendMessages() {


Socket socket = null;
try {
socket = new Socket(host, PORT);
Scanner networkInput = new
Scanner(socket.getInputStream());
PrintWriter networkOutput = new
PrintWriter(socket.getOutputStream(), true);

//Set up stream untuk masukan dari keyboard...


Scanner userEntry = new Scanner(System.in);
String message, response;
do {
System.out.print("Masukkan pesan ('QUIT' untuk
keluar): ");
message = userEntry.nextLine();

//Kirim pesan (message)ke server pada output stream


socket...
//Terima respon dari server pada stream input
socket...
networkOutput.println(message);
response = networkInput.nextLine();

//Tampilkan respon dari server...


System.out.println("\nSERVER> " + response);
} while (!message.equals("QUIT"));
} catch (IOException ioEx) {
//ioEx.printStackTrace();
} finally {
try {
System.out.println("\nMenutup koneksi...");
socket.close();
} catch (IOException ioEx) {
System.out.println("Gagal menutup koneksi!");
System.exit(1);
}
}
}
}

LATIHAN

1. Mengubah Program Server (MultiEchoServer) agar Program Klien


mendapatkan informasi Tanggal dan IP Address dari Server.

10
TUGAS

1. Sebutkan manfaat dari Multithreading.

REFERENSI

1. https://www.javatpoint.com/socket-programming
2. https://docplayer.info/49613446-Sistem-operasi-thread-dan-
multithreading.html
3. https://www.academia.edu/25177814/_Modul_Konsep_Jaringan_Bab_
12_Socket_Programming
4. https://komputasi.wordpress.com/2010/11/02/java-contoh-server-
client-multi-thread/
5. https://docplayer.info/49613446-Sistem-operasi-thread-dan-
multithreading.html
6. https://www.sinaungoding.com/konsep-multithreading-java/
7. https://slideplayer.com/slide/9605738/
8. http://yuliana.lecturer.pens.ac.id/Prog%20Lanjut/Networking/socket.pdf

11

Anda mungkin juga menyukai