JAVA ile DAĞITIK PROGRAMLAMA



Benzer belgeler
KARADENİZ TEKNİK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR AĞLARI LABORATUARI. Soket Programlama

Görsel Programlama DERS 12. Görsel Programlama - Ders12/

Soket, bir sunucu programı ve bir veya birden çok istemci programı arasında çift yönlü iletişim kuran bir yazılım uç noktasıdır.

BİL132 Bilgisayar Programlama II

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama


/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

F.Ü. Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü Bilgisayar Sistemleri Laboratuvarı DENEY NO: 6 JAVA İLE DAĞITIK PROGRAMLAMA.

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Dağıtık Sistemler CS5001

Alıştırmalar 2 - Dağıtık Sistemler. Alıştırma 2. Prof. Dr. Th. Letschert Çeviri: Turgay Akbaş FB MNI 16. Mai 2013

// hataları işaret eden referans

Dağıtık Sistemler CS5001

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

BİL-141 Bilgisayar Programlama I (Java)

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

F.Ü. Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü Bilgisayar Sistemleri Laboratuvarı DENEY NO: 6 JAVA İLE DAĞITIK PROGRAMLAMA.

BİL-141 Bilgisayar Programlama I (Java)

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

JAVA DA GİRİŞ/ÇIKIŞ İŞLEMLERİ. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 9 1

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

Scanner Sınıfı. Class Scanner. java.util. java.lang.object java.util.scanner. Kılgıladığı Arayüzler: Closeable, AutoCloseable, Iterator<String>

Nesne Yönelimli Programlama

Nesneye yönelik: Javada herşey bir nesnedir. Java nesne yönelimli olduğu için kolayca geliştirilebilir.

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

İş Parçacıkları Thread(s)

Java Class Yapısında Finalize Metotunun Kullanımı

ByteArrayOutputStream

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Programlama Dillerinde Kullanılan Veri Tipleri

Görsel Programlama DERS 11. Görsel Programlama - Ders11/ 1

Klavyeden Basit Giriş/Çıkış İşlemleri

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

JAVA PROGRAMLAMAYA GİRİŞ

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 4. UYGULAMA

JAVA API v2.0 Belge sürümü: 2.0.2

ATATÜRK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BIM 205 GÖRSEL PROGRAMLAMA GÜZ DÖNEMİ ÖDEV-1

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

BİL-141 Bilgisayar Programlama I (Java)

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

BM-209 Nesne Yönelimli Programlama

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 9. UYGULAMA

Örnek 1: Programı yazın ve çalıştırın.

public static int Toplam int x, int y

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 11

İki Yöntem. Komposizyon (Composition) Kalıtım (Inheritance)

Sınıfların Tekrardan Kullanılması. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 5 1

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Java da İşleçler, Ders #3 (4 Kasım 2009)

BIL101 07/11/2012 Lab5 Programlama Sorulari

Sunum İçeriği. Programlamaya Giriş

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

BMH-303 Nesneye Yönelik Programlama

Üst Düzey Programlama

İŞ PARÇACIKLARI (THREADS)

Java Programlamada Paket Yapısı Ve Import

PORT HABERLEŞME SERİ PORT FARUK BOZAN

3.Hafta. . Kontrol Deyimleri/İfadeler

Ders - 7 while döngüsü

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

T.C. KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

EMT2226 Nesne Yönelimli Programlamaya Giriş

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

İş Parçacıkları (Threads)

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

Dağıtık Sistemler CS5001

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

BIL411 - BİLGİSAYAR AĞLARI LABORATUVARI

Kurumsal Güvenlik ve Web Filtreleme

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ECLIPSE PROGRAMININ ÇALIŞTIRILMASI

Class LinkedHashMap. Class LinkedHashMap java.lang.object java.util.abstractmap java.util.hashmap java.util.linkedhashmap. Kılgıladığı arayüzler:

MAT213 Bilgisayar Programlama I

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 10

Kurumsal Güvenlik ve Web Filtreleme

C# Metotlar ve Metot Tanımlama

İlgili Konular: Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

Güz Yarıyılı Balıkesir Üniversitesi Bilgisayar Mühendisliği Bölümü

Güz Yarıyılı Balıkesir Üniversitesi Bilgisayar Mühendisliği Bölümü

JAVADA DİZİ İŞLEMLERİ

Java Programlamaya Giriş

Ağ Sunucusu Programlaması. Bora Güngören Portakal Teknoloji

Transkript:

KARADENİZ TEKNİK ÜNİVERSİTESİ Bilgisayar Mühendisliği Bölümü Bilgisayar Sistemleri Laboratuarı JAVA ile DAĞITIK PROGRAMLAMA 1. Giriş JAVA, ağdaki programların haberleşmesi için TCP ve UDP olmak üzere iki farklı socket türü kullanır. Her iki socket türü de haberleşmede Client-Server ilişkisini kullanır. Bu deneyde TCP socket kullanılarak Server ve Client bilgisayarlar için yazılacak socket programları ile JAVA ile dağıtık programlama anlatılacaktır. Örnek programlar An Introduction to Network Programming with Java adlı kitaptan alınmıştır. 2. Server Socket Setlemeleri Burada Client bilgisayar ile haberleşme için gerekli Server Socket setlemeleri anlatılacaktır: 2.1. ServerSocket Nesnesi Türetme servsock isimli ServerSocket nesnesi 1024-65535 arası yani özel amaçlar için ayrılmış numaraların dışında bir port numarası seçerek aşağıdaki gibi oluşturulur: ServerSocket servsock = new ServerSocket(1234); 2.2. Server ı Bekleme Konumuna Getirme servsock, ServerSocket sınıfına ait accept methodunu kullanarak herhangi bir Client ın bağlanmasını bekler. Bağlantı kurulduğunda aşağıdaki gibi link isimli bir Socket nesnesi türetilir: Socket link = servsock.accept(); 2.3. Gönderilecek/Alınacak Veriler için Input/Output Stream Setleme Client bilgisayardan gelecek mesajları almak ve ona mesaj göndermek üzere Socket sınıfına ait getinputstream ve getoutputstream methodları kullanılarak input ve output isimli stream nesneleri aşağıdaki gibi türetilir: Scanner input = new Scanner(link.getInputStream()); PrintWriter output = new PrintWriter(link.getOutputStream(),true); 2.4. Veri Gönderme ve Alma Veri gönderme ve alma işlemleri için sırasıyla println ve nextline methodları kullanılır : output.println(... ); String message = input.nextline();

2.5. Bağlantıyı Sonlandırma Bağlantı Socket sınıfının close methodu ile sonlandırılır: link.close(); 3. Client Socket Setlemeleri Server ile bağlantı kurma dışındaki Client Socket setlemeleri yukarıda Server için anlatılanlarla ayınıdır. Server ile bağlantı kurmak için link isimli Socket nesnesi Server ın ismi (veya IP adresi) ve port numarası parametreleri yardımıyla aşağıdaki gibi türetilir: Socket link = new Socket( ServerName, 1234); 4. Client-Server Programı Aşağıda örnek bir Client-Server programı ve ekran çıktısı verilmiştir. Öncelikle TCPServer.java programı koşularak Server başlatılır. Sonra TCPClient.java koşularak Server ile bağlantı kurulur. Bu örnekte Client tarafından gönderilen mesajlar Server tarafından sayılır ve BYE BYE mesajı geldiğinde bağlantı sonlandırılırken toplam mesaj sayısı yazılır. TCPServer.java import java.io.*; import java.net.*; import java.util.*; public class TCPServer private static ServerSocket servsock; private static final int PORT = 1234; public static void main(string[] args) servsock = new ServerSocket(PORT); System.out.println("Waiting for connection...\n"); System.out.println("Unable to attach to port!"); do while (true); handleclient(); 2

private static void handleclient() Socket link = null; String message = null; link = servsock.accept(); Scanner input = new Scanner(link.getInputStream()); PrintWriter output = new PrintWriter(link.getOutputStream(),true); int nummessages = 1; TCPClient.java import java.io.*; import java.net.*; import java.util.*; message = input.nextline(); while (!message.equals("bye BYE")) System.out.println("Received Message : " + message); nummessages++; message = input.nextline(); output.println(nummessages + " messages received."); ioex.printstacktrace(); Finally System.out.println("Because of Received Message : " + message); System.out.println(" * Closing connection... *"); link.close(); System.out.println("Unable to disconnect!"); public class TCPClient private static InetAddress host; private static final int PORT = 1234; public static void main(string[] args) //host = InetAddress.getByName("ServerName"); host = InetAddress.getLocalHost(); System.out.println("Connected to Server"); catch(unknownhostexception uhex) System.out.println("Host ID not found!"); accessserver(); 3

private static void accessserver() Socket link = null; link = new Socket(host,PORT); Scanner input = new Scanner(link.getInputStream()); PrintWriter output = new PrintWriter(link.getOutputStream(),true); Scanner useren = new Scanner(System.in); String message, response; do System.out.print("Enter message : "); message = useren.nextline(); output.println(message); while (!message.equals("bye BYE")); response = input.nextline(); System.out.println("\nSERVER > "+response); ioex.printstacktrace(); finally System.out.println("* Closing connection... *"); link.close(); System.out.println("Unable to disconnect!"); SERVER [0]Waiting for connection... [3]Received Message : MERHABA [5]Received Message : NASILSIN [7]Because of Received Message : BYE BYE * Closing connection... * CLIENT [1]Connected to Server [2]Enter message : MERHABA [4]Enter message : NASILSIN [6]Enter message : BYE BYE [8]SERVER > 3 messages received. * Closing connection... * 4

5. Multithreading Java ile dağıtık programlamada Server bilgisayara 1 den fazla Client bilgisayarın bağlantı kurması durumunda her bir Client bilgisayar için bir thread başlatılır. Bunun için öncelikle Thread sınıfı miraslanarak bir thread nesnesi türetilir. start methodu ile bu threadin yapacağı işin kodunu barındıran run methodu çağrılır. Çok sayıda thread aynı anda koşarken birbirlerine zaman ayırmaları için sleep methodu kullanılır ve parametre olarak aldığı milisaniye cinsinden zaman kadar askıda durur. Aşağıdaki örnek programda biri 5 kere Hello ; diğeri de 1-5 arası sayıları ekrana yazan iki threadi çağıran ThreadHelloCount adlı java programı ve çıktısı verilmiştir: ThreadHelloCount.java import java.io.*; public class ThreadHelloCount public static void main(string[] args) HelloThread hello = new HelloThread(); CountThread count = new CountThread(); hello.start(); count.start(); class HelloThread extends Thread public void run() for (int i=0; i<5; i++) System.out.println("Hello!"); sleep((int)(math.random()*1000)); catch (InterruptedException interruptex) System.out.println(interruptEx); class CountThread extends Thread public void run() for (int i=0; i<5; i++) System.out.println(i); sleep((int)(math.random()*1000)); catch (InterruptedException interruptex) System.out.println(interruptEx); Hello! 0 1 Hello! 2 3 Hello! Hello! 4 Hello! 5

Yukarıdaki program çıktısına dikkat edilirse threadler farklı sıklıklarla çağrılmıştır. Bunun nedeni sleep methodundaki Math.random()*1000 ifadesidir. Böylece random fanksiyonu ile her bir thread 0 ile 1 saniye arasında değişen farklı sürelerde askıda durmaktadır. Dolayısıyla ThreadHelloCount adlı program her koşuşunda farklı bir çıktı üretecektir. Aşağıda, daha önce anlatılan TCPServer ve TCPClient programlarının multithreading versiyonu verilmiştir. MutiServer.java programı, Thread sınıfını miraslayan ClientHandler sınıfı herbir Client bağlantısında bir thread başlatmaktadır. MultiClient.java programı TCPClient ile hemen hemen aynıdır. MultiServer.java import java.io.*; import java.net.*; import java.util.*; public class MultiServer private static ServerSocket serversocket; private static final int PORT = 1234; public static void main(string[] args) throws IOException serversocket = new ServerSocket(PORT); catch (IOException ioex) System.out.println("\nUnable to set up port!"); do Socket client = serversocket.accept(); System.out.println("\nNew client accepted.\n"); ClientHandler handler = new ClientHandler(client); handler.start(); //As usual, method calls run. while (true); class ClientHandler extends Thread private Socket client; private Scanner input; private PrintWriter output; public ClientHandler(Socket socket) //Set up reference to associated socket... client = socket; input = new Scanner(client.getInputStream()); output = new PrintWriter( client.getoutputstream(),true); ioex.printstacktrace(); 6

public void run() String received; do //Accept message from client on the socket's input stream... received = input.nextline(); //Echo message back to client on the socket's output stream... output.println("echo: " + received); while (!received.equals("quit")); //Repeat above until 'QUIT' sent by client... if (client!=null) System.out.println("Closing down connection..."); client.close(); System.out.println("Unable to disconnect!"); MultiClient.java import java.io.*; import java.net.*; import java.util.*; public class MultiClient private static InetAddress host; private static final int PORT = 1234; public static void main(string[] args) //host = InetAddress.getByName("ServerName"); host = InetAddress.getLocalHost(); catch(unknownhostexception uhex) System.out.println("\nHost ID not found!\n"); sendmessages(); 7

private static void sendmessages() Socket socket = null; socket = new Socket(host,PORT); Scanner networkinput = new Scanner(socket.getInputStream()); PrintWriter networkoutput = new PrintWriter(socket.getOutputStream(),true); Scanner useren = new Scanner(System.in); String message, response; do System.out.print("Enter message ('QUIT' to exit): "); message = useren.nextline(); networkoutput.println(message); response = networkinput.nextline(); System.out.println("\nSERVER> " + response); while (!message.equals("quit")); ioex.printstacktrace(); finally System.out.println("\nClosing connection..."); socket.close(); System.out.println("Unable to disconnect!"); 6. Synchronized Thread ler Farklı threadlerin ortak kullandıkları kaynaklara eşzamanlı erişimleri yanlış sonuçlar üretmeye neden olabilir. O yüzden ortak kaynaklara erişimi engelleyecek bir mekanizmaya ihtiyaç vardır. Java synchronized anahtar kelimesi ile bunu gerçekleştirir. Örneğin aşağıdaki methodda ortak kullanılan sum adlı değişkenin aynı anda farklı threadler tarafından güncellenmemesi için updatesum adlı method synchronized yapılmıştır. public synchronized void updatesum(int amount) sum+=amount; Synchronized bir methodu koşan thread e o anlık bir iş düşmüyorsa wait methodunu çağırarak synchronized method üzerindeki kilidi kaldırır ve böylece diğer threadlerin de o methodu koşmasına izin verir. Eğer bir thread işini tamamlamışsa ve wait konumundaki başka bir thread in çalışmasını sağlamak istiyorsa notify methodunu kullanır. Wait konumundaki bütün threadlerin çalıştırılması için de notifyall methodu kullanılır. Bu durumda hangi thread e öncelik verileceğine JVM karar verir. 8

6.1. Producer-Consumer Problemi Bilindiği gibi producer-consumer probleminde producerın ürettiği consumerın tükettiği ortak kaynak kullanılmaktadır. Burada en önemli problem kaynağa eş zamanlı erişimi engelleyerek tutarlılığı sağlamaktır. Yukarıda da bahsedildiği gibi producer ve consumerın ortak çağırdıkları methodlar synchronized yapılarak tutarlı bir kaynak güncellemesi yapılabilecektir. Producer-consumer uygulaması, kaynak kodlardan Multi Producer-Consumer adlı klasörün içindedir. Producer ve consumerın ortak erişeceği, kaynak (resourse) üretme ve tüketme işini yapan addone ve takeone methodları, Resourse.java programı içindedir. ResourseServer.java programı öncelikle item isimli bir Resourse nesnesi türetir ve bu nesneyi parametre vererek türettiği Producer türünden producer isimli thread nesnesinde addone methodunu sürekli çağırarak kaynak üretmeye başlar. ResourseServer adından da anlaşılabileceği gibi aynı zamanda bir server programıdır. Kaynak üreten server programıdır. Kaynak tüketimi de bu servera bağlanan clientlar tarafından yapılacaktır. Bağlantı kurulduğunda ResourseServer programında handler isimli bir ClientThread threadi başlatılır ve clientlerın isteklerine cevap verilir. Client bilgisayar 1 karakteri yolladıkça kaynakları tutan item nesnesinin takeone methodu çağrılarak kaynak harcanır. 0 karakteri ile de bağlantı sonlandırılır. Kaynak üretimi belli bir MAX (5) değerle sınırlandırılmıştır. Bu değere ulaşıldığında wait methodu çağrılarak clientların kaynağı harcaması beklenir. Ayrıca herhangi bir kaynak üretildiğinde de yine tüketilebilmesi için notifiyall methodu ile clientlara bilgi verilir. 7. Deneye Hazırlık Bölüm 6.1. de anlatılan Producer-Consumer uygulamasında Client bilgisayarda koşacak program Multithreading uygulamasındaki MultiClient.java programına çok benzediği için ayrıca anlatılmamıştır. MultiClient.java programının ismini ConsumerClient.java olarak değiştiriniz ve gerekli değişiklikleri yaparak Producer-Consumer uygulamasının doğru bir şekilde çalışmasını sağlayınız. Yazdığınız programı deneye getiriniz. 8. Deneyin Yapılışı Resource.java programı ekrana addone methodunda üretilen, takeone da da kalan numresources toplam kaynak sayısını yazmaktadır. Bunun yerine Resourse.java programına ( Deneyin Yapılışı adlı klasördeki basit bir Stack uygulamasından da yararlanarak) Stack ekleyip, addone methodu çağrıldığında hangi kaynağın üretildiğini PUSHED ITEM = 55 şeklinde, takeone çağırıldığında da hangi kaynağın tüketildiğini POPED ITEM = 55 şeklinde ekrana yazınız. Burada üretilen kaynak numresources değişkeninden farklı olarak 0..100 arası random belirlensin. Dolayısıyla stack e itilen ve stack ten çekilen değerler de 0..100 arası olacaktır. Stack in dolu veya boş olduğu bilgisini de STACK IS FULL/EMPTY şeklinde ekrana yazınız. Resourse.java programının başında java.util.*; adlı package i import etmeyi unutmayınız. ResourseServer.java, ConsumerClient.java ya YOU POPED = 55 şeklinde stackten çekilen değeri yollasın. ConsumerClient.java programından gelen isteklere ( 1 veya 0 ) bağlı olarak ResourseServer.java ve ConsumerClient.java programlarının ekran çıktısı aşağıdakine benzer olmalıdır : 9

RESOURSESERVER.JAVA CONSUMERCLIENT.JAVA PUSHED ITEM = 55 Enter message ('0' to exit): 1 New client accepted. SERVER> YOU POPED = 55 POPED ITEM = 55 Enter message ('0' to exit): 1 PUSHED ITEM = 21 SERVER> YOU POPED = 21 POPED ITEM = 21 Enter message ('0' to exit): 1 STACK IS EMPTY SERVER> YOU POPED = 12 PUSHED ITEM = 12 Enter message ('0' to exit): 1 POPED ITEM = 12 SERVER> YOU POPED = 73 STACK IS EMPTY Enter message ('0' to exit): 1 PUSHED ITEM = 73 SERVER> YOU POPED = 6 POPED ITEM = 73 Enter message ('0' to exit): 1 PUSHED ITEM = 51 SERVER> YOU POPED = 51 PUSHED ITEM = 6 Enter message ('0' to exit): 1 POPED ITEM = 6 SERVER> YOU POPED = 47 POPED ITEM = 51 Enter message ('0' to exit): 0 STACK IS EMPTY SERVER> Connection closed... PUSHED ITEM = 47 Closing connection... POPED ITEM = 47 Process completed. PUSHED ITEM = 48 PUSHED ITEM = 18 PUSHED ITEM = 17 PUSHED ITEM = 0 PUSHED ITEM = 70 STACK IS FULL Closing down connection... 8. Rapor Raporu programların olduğu klasördeki şablon belgeyi kullanarak yazınız. Rapor grup adına yazılacaktır. Her öğrencinin ayrı ayrı rapor yazmasına gerek yoktur. Raporun son teslim tarihi sonraki hafta deney saatidir. Daha geç verilen raporlar değendirilmeyecektir. 9. Değerlendirme Kriterleri Deney notu aşağıdaki kriterlere göre verilecektir: DENEYE HAZIRLIK DENEYİN YAPILIŞI RAPOR 40 PUAN 40 PUAN 20 PUAN 10