Java - Ağ İletişimi

Terimi ağ programlama cihazlarının her bir ağ kullanarak birbirine bağlı olduğu birden fazla cihaz (bilgisayarlar), karşısında yürütme program yazmaya ifade eder.

J2SE API'lerinin java.net paketi, elinizdeki sorunu çözmeye odaklanan programlar yazmanıza olanak tanıyan, düşük seviyeli iletişim ayrıntılarını sağlayan bir sınıflar ve arabirimler koleksiyonu içerir.

Java.net paketi, iki yaygın ağ protokolü için destek sağlar -

  • TCP- TCP, iki uygulama arasında güvenilir iletişime izin veren İletim Kontrol Protokolü anlamına gelir. TCP, genellikle TCP / IP olarak adlandırılan İnternet Protokolü üzerinden kullanılır.

  • UDP - UDP, uygulamalar arasında veri paketlerinin aktarılmasına izin veren bağlantısız bir protokol olan Kullanıcı Datagram Protokolü anlamına gelir.

Bu bölüm, aşağıdaki iki konu hakkında iyi bir anlayış sağlar -

  • Socket Programming - Bu, Networking'de en çok kullanılan kavramdır ve çok detaylı bir şekilde açıklanmıştır.

  • URL Processing- Bu ayrı ayrı ele alınacaktır. Java dilinde URL İşleme hakkında bilgi edinmek için burayı tıklayın .

Soket Programlama

Soketler, TCP kullanan iki bilgisayar arasındaki iletişim mekanizmasını sağlar. Bir istemci programı, iletişimin sonunda bir soket oluşturur ve bu soketi bir sunucuya bağlamayı dener.

Bağlantı yapıldığında, sunucu iletişimin sonunda bir soket nesnesi oluşturur. İstemci ve sunucu artık sokete yazıp okuyarak iletişim kurabilir.

Java.net.Socket sınıfı bir soketi temsil eder ve java.net.ServerSocket sınıfı, sunucu programının istemcileri dinlemesi ve onlarla bağlantı kurması için bir mekanizma sağlar.

Soketler kullanarak iki bilgisayar arasında bir TCP bağlantısı kurulurken aşağıdaki adımlar gerçekleşir -

  • Sunucu, hangi bağlantı noktası numarası iletişiminin gerçekleşeceğini belirten bir ServerSocket nesnesi başlatır.

  • Sunucu, ServerSocket sınıfının kabul () yöntemini çağırır. Bu yöntem, bir istemci verilen bağlantı noktasındaki sunucuya bağlanana kadar bekler.

  • Sunucu bekledikten sonra, bir istemci, sunucu adını ve bağlanılacak bağlantı noktası numarasını belirterek bir Socket nesnesini başlatır.

  • Socket sınıfının yapıcısı, istemciyi belirtilen sunucuya ve bağlantı noktası numarasına bağlamaya çalışır. İletişim kurulursa, istemcinin artık sunucuyla iletişim kurabilen bir Socket nesnesi vardır.

  • Sunucu tarafında, kabul () yöntemi, istemcinin soketine bağlı olan sunucudaki yeni bir sokete bir başvuru döndürür.

Bağlantılar kurulduktan sonra, I / O akışları kullanılarak iletişim gerçekleşebilir. Her soket hem bir OutputStream hem de bir InputStream'e sahiptir. İstemcinin OutputStream'i sunucunun InputStream'ine bağlanır ve istemcinin InputStream'i sunucunun OutputStream'ine bağlıdır.

TCP iki yönlü bir iletişim protokolüdür, dolayısıyla veriler her iki akış üzerinden aynı anda gönderilebilir. Aşağıda, soketleri uygulamak için eksiksiz yöntemler kümesi sağlayan kullanışlı sınıflar yer almaktadır.

ServerSocket Sınıf Yöntemleri

java.net.ServerSocket sınıfı, bir bağlantı noktası almak ve istemci isteklerini dinlemek için sunucu uygulamaları tarafından kullanılır.

ServerSocket sınıfının dört kurucusu vardır -

Sr.No. Yöntem ve Açıklama
1

public ServerSocket(int port) throws IOException

Belirtilen bağlantı noktasına bağlı bir sunucu soketi oluşturma girişimleri. Bağlantı noktası zaten başka bir uygulama tarafından bağlanmışsa bir istisna oluşur.

2

public ServerSocket(int port, int backlog) throws IOException

Önceki kurucuya benzer şekilde, bekleme listesi parametresi, bir bekleme kuyruğunda kaç gelen istemcinin depolanacağını belirtir.

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

Önceki kurucuya benzer şekilde, InetAddress parametresi bağlanılacak yerel IP adresini belirtir. InetAddress, birden çok IP adresine sahip olabilen sunucular için kullanılır ve sunucunun, hangi IP adreslerinin istemci isteklerini kabul edeceğini belirlemesine izin verir.

4

public ServerSocket() throws IOException

Bağlantısız bir sunucu soketi oluşturur. Bu yapıcıyı kullanırken, sunucu soketini bağlamaya hazır olduğunuzda bind () yöntemini kullanın.

ServerSocket yapıcısı bir istisna oluşturmazsa, bu, uygulamanızın belirtilen bağlantı noktasına başarıyla bağlandığı ve istemci istekleri için hazır olduğu anlamına gelir.

Aşağıda, ServerSocket sınıfının yaygın yöntemlerinden bazıları verilmiştir -

Sr.No. Yöntem ve Açıklama
1

public int getLocalPort()

Sunucu soketinin dinlediği bağlantı noktasını döndürür. Bir kurucuda port numarası olarak 0'ı geçtiyseniz ve sunucunun sizin için bir port bulmasına izin verdiyseniz, bu yöntem kullanışlıdır.

2

public Socket accept() throws IOException

Gelen bir müşteriyi bekler. Bu yöntem, zaman aşımı değerinin setSoTimeout () yöntemi kullanılarak ayarlandığını varsayarak, bir istemci sunucuya belirtilen bağlantı noktasında bağlanana kadar veya soket zaman aşımına uğrayıncaya kadar engeller. Aksi takdirde, bu yöntem süresiz olarak engellenir.

3

public void setSoTimeout(int timeout)

Kabul () sırasında sunucu soketinin bir istemciyi ne kadar bekleyeceğine ilişkin zaman aşımı değerini ayarlar.

4

public void bind(SocketAddress host, int backlog)

Soketi, SocketAddress nesnesindeki belirtilen sunucuya ve bağlantı noktasına bağlar. No-argument yapıcısını kullanarak ServerSocket örneğini oluşturduysanız, bu yöntemi kullanın.

ServerSocket, accept () yöntemini çağırdığında, istemci bağlanana kadar yöntem geri dönmez. Bir istemci bağlandıktan sonra, ServerSocket belirtilmemiş bir bağlantı noktasında yeni bir Soket oluşturur ve bu yeni Sokete bir başvuru döndürür. İstemci ile sunucu arasında artık bir TCP bağlantısı mevcuttur ve iletişim başlayabilir.

Soket Sınıfı Yöntemleri

java.net.Socketclass, hem istemcinin hem de sunucunun birbirleriyle iletişim kurmak için kullandığı soketi temsil eder. İstemci, bir Socket nesnesini örnekleyerek elde eder, oysa sunucu, accept () yönteminin dönüş değerinden bir Socket nesnesi alır.

Socket sınıfı, bir istemcinin bir sunucuya bağlanmak için kullandığı beş kurucuya sahiptir -

Sr.No. Yöntem ve Açıklama
1

public Socket(String host, int port) throws UnknownHostException, IOException.

Bu yöntem, belirtilen bağlantı noktasında belirtilen sunucuya bağlanmaya çalışır. Bu kurucu bir istisna oluşturmazsa, bağlantı başarılı olur ve istemci sunucuya bağlanır.

2

public Socket(InetAddress host, int port) throws IOException

Bu yöntem, ana bilgisayarın bir InetAddress nesnesi tarafından belirtilmesi dışında önceki kurucu ile aynıdır.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

Belirtilen ana bilgisayara ve bağlantı noktasına bağlanarak yerel ana bilgisayarda belirtilen adreste ve bağlantı noktasında bir soket oluşturur.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

Bu yöntem, ana bilgisayarın bir String yerine bir InetAddress nesnesi tarafından gösterilmesi dışında önceki kurucu ile aynıdır.

5

public Socket()

Bağlantısız bir soket oluşturur. Bu soketi bir sunucuya bağlamak için connect () yöntemini kullanın.

Socket yapıcısı döndüğünde, yalnızca bir Socket nesnesini başlatmaz, aynı zamanda belirtilen sunucuya ve bağlantı noktasına bağlanmaya çalışır.

Socket sınıfındaki bazı ilgi çekici yöntemler burada listelenmiştir. Hem istemcinin hem de sunucunun bir Socket nesnesine sahip olduğuna dikkat edin, bu nedenle bu yöntemler hem istemci hem de sunucu tarafından çağrılabilir.

Sr.No. Yöntem ve Açıklama
1

public void connect(SocketAddress host, int timeout) throws IOException

Bu yöntem, soketi belirtilen ana bilgisayara bağlar. Bu yönteme yalnızca, bağımsız değişken olmayan yapıcıyı kullanarak Soketi başlattığınızda gereklidir.

2

public InetAddress getInetAddress()

Bu yöntem, bu soketin bağlı olduğu diğer bilgisayarın adresini döndürür.

3

public int getPort()

Uzak makinede soketin bağlı olduğu bağlantı noktasını döndürür.

4

public int getLocalPort()

Yerel makinede soketin bağlı olduğu bağlantı noktasını döndürür.

5

public SocketAddress getRemoteSocketAddress()

Uzak soketin adresini döndürür.

6

public InputStream getInputStream() throws IOException

Soketin giriş akışını döndürür. Giriş akışı, uzak soketin çıkış akışına bağlanır.

7

public OutputStream getOutputStream() throws IOException

Soketin çıkış akışını döndürür. Çıkış akışı, uzak soketin giriş akışına bağlanır.

8

public void close() throws IOException

Soketi kapatarak bu Socket nesnesinin artık herhangi bir sunucuya tekrar bağlanmasını engeller.

InetAddress Sınıf Yöntemleri

Bu sınıf bir İnternet Protokolü (IP) adresini temsil eder. Soket programlamayı yaparken ihtiyaç duyacağınız faydalı yöntemleri aşağıda bulabilirsiniz -

Sr.No. Yöntem ve Açıklama
1

static InetAddress getByAddress(byte[] addr)

Ham IP adresi verilen bir InetAddress nesnesi döndürür.

2

static InetAddress getByAddress(String host, byte[] addr)

Sağlanan ana bilgisayar adı ve IP adresine göre bir InetAddress oluşturur.

3

static InetAddress getByName(String host)

Ana bilgisayarın adı verilen bir ana bilgisayarın IP adresini belirler.

4

String getHostAddress()

Metinsel sunumda IP adresi dizesini döndürür.

5

String getHostName()

Bu IP adresi için ana bilgisayar adını alır.

6

static InetAddress InetAddress getLocalHost()

Yerel ana bilgisayarı döndürür.

7

String toString()

Bu IP adresini bir String'e dönüştürür.

Soket İstemci Örneği

Aşağıdaki TebrikClient, bir yuva kullanarak bir sunucuya bağlanan ve bir karşılama mesajı gönderen ve ardından bir yanıt bekleyen bir istemci programıdır.

Misal

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Soket Sunucusu Örneği

Aşağıdaki Selamlama Sunucusu programı, bir komut satırı bağımsız değişkeni tarafından belirtilen bir bağlantı noktası numarasındaki istemcileri dinlemek için Socket sınıfını kullanan bir sunucu uygulaması örneğidir -

Misal

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

İstemciyi ve sunucuyu derleyin ve ardından sunucuyu aşağıdaki gibi başlatın -

$ java GreetingServer 6066
Waiting for client on port 6066...

İstemci programını aşağıdaki şekilde kontrol edin -

Çıktı

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!