6. UDP/IP Haberleşmesi
UDP protokolü Datagram ile çalışan TCP protokolune göre hızlı olan fakat gönderimde oluşucak problemleri ele almayan bu sebeple güvenilir(reliable) bulunmayan bir protokoldür. Genel olarak Client/Server mimaride TCP tercih edilmesine karşın, video iletimi yada kaybolmanın önemli olmadığı senaryolarda tercih edilebilmektedir.
UDP/IP haberleşmesi bağlantısız çalışan bir haberleşme protokolüdür. Bu protokol her ne kadar Client/Server haberleşmesi olarak kullanılsa da genel olarak Client : Gönderen Taraf(Sender), Server : Alan Taraf(Reciever) olarak kullanılmaktadır. UDP/IP haberleşmesi aynı ağda bulunan tüm sistemlere veri gönderimi(Broadcast) işlemine de olanak sağlamaktadır.
UDP/IP haberleşmesinde veriler ismine Datagram şeklinde paketlenir ve gönderilir. Alıcı taraf ise veriyi Datagram şeklinde alır ve kullanır.
DatagramSocket Sınıfı
Şüphesiz kullanılan protokolun temeli IP protokolü olduğundan yine ortak bir portta anlaşılmalıdır.
UDP işlemi için server programın tasarımı genel olarak şu şekildedir:
| Server | Client | | -- | -- | | soket aç | soket Aç | | bind | connect | | listen | send/recv | | accept | soket kapat | | send/recV | | | soket kapat | ||
Gönderip alma işlemleri için gereken Datagram, DatagramPacket isimli bir sınıf ile yapılır. sınıfının bir çok başlangıç metodu bulunmaktadır.
DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket(byte[] buf, int offset, int length)
DatagramSocket sınıfının recieve(DatagramPacket p)
metodu ile paket beklenebilir.
Anahtar Not: String sınıfının bir byte dizisinden String elde eden bir başlangıç metodu vardır. Tersi de benzer şekilde String sınıfının getByte() metodu ile bir yazı byte dizisine dönüştürülebilir. Şüphesiz kullanılan tablolalama yöntemine göre çevirme işlemleri farklılaşacaktır. Bu konu ileride ele alınacaktır.
Aynı ağda bulunan tüm makinalara mesaj göndermek için ilgili ağın x.y.z.255 numaralı ipye gönderilmelidir.(ipv4 için geçerli) Bu durumda ağ içerisindeki makinalarda aynı porttan dinleme yapan programlar bu mesajı karşılayabileceklerdir.
Yukarıdaki uygulamada String türüne çevirme işleminde 100 byte birden çevrilecektir. Bu durumun efektif çalışması ileride ele alınacaktır.
Sınıf Çalışması:
çözümü: 002-PanicUDPServer
Yarım saniyede bir Broadcast olarak "ok" isimli bir yazı gönderen fakat panic isimli bir butona basıldığında "panic" isimli yazıyı gönderip tüm serverlardan ilgili mesajı bekleyen bir konsol-server ve swing-client programını yazınız. Panic/Server uygulamasında Client uygulamayı Swing uygulaması olarak yazınız.
Sınıf Çalışması:
çözümü: 003-PanicUDP-TCPServer
002-PanicUDPServer uygulamasında panic işlemine ilişkin yapıyı garanti olması açısından TCP olacak şekilde Client/Server yazınız.
Anahtar Notlar: Uygulama konsol da tasarlansa bir akışını sonlanmasını istemiyorsak sonsuz bir döngüde beklemek iyi bir teknik değildir. Çünkü sonsuz döngüde beklemek o thread'in ilgili işlemciyi meşgul etmesine yol açar. Bu tip durumlarda bekliycek Thread içerisinde diğer Thread'in referansını kullanarak beklemek veya Thread havuzları kullanılıyorsa, future.get() şeklinde beklemek gerekmektedir.