Java'da Ağ Uygulaması Nasıl Oluşturulur (Resimlerle)

İçindekiler:

Java'da Ağ Uygulaması Nasıl Oluşturulur (Resimlerle)
Java'da Ağ Uygulaması Nasıl Oluşturulur (Resimlerle)

Video: Java'da Ağ Uygulaması Nasıl Oluşturulur (Resimlerle)

Video: Java'da Ağ Uygulaması Nasıl Oluşturulur (Resimlerle)
Video: Telefonda Ekran Kaydı Nasıl Alınır? 2024, Mayıs
Anonim

Belirli bir cihazda çalışan kod yazmak çok tatmin edici. Ancak, birbiriyle iletişim kuran birkaç cihazda çalışan kod yazmak, yaşamı onaylar. Bu makale size iletim kontrol protokolünü (TCP) kullanarak ağ üzerinden nasıl bağlanacağınızı ve mesaj alışverişi yapacağınızı öğretecektir.

Bu yazıda, bilgisayarınızı kendine bağlayacak ve aslında onu çıldırtacak - kendi kendine konuşacak bir uygulama kuracaksınız. Ayrıca Java'da ağ oluşturmak için en yaygın olarak kullanılan iki akış arasındaki farkı ve nasıl çalıştıklarını öğreneceksiniz.

Veri ve Nesne Akışları

Kodlara dalmadan önce, makalede kullanılan iki akış arasındaki farkın ayırt edilmesi gerekir.

Veri Akışları

Veri akışları, ilkel veri türlerini ve dizeleri işler. Veri akışları üzerinden gönderilen verilerin manuel olarak serileştirilmesi ve seri durumdan çıkarılması gerekir, bu da karmaşık verilerin aktarılmasını zorlaştırır. Ancak veri akışları, Java dışındaki dillerde yazılmış sunucular ve istemcilerle iletişim kurabilir. Ham akışlar, bu açıdan veri akışlarına benzer, ancak veri akışları, verilerin platformdan bağımsız bir şekilde biçimlendirilmesini sağlar; bu, her iki tarafın da gönderilen verileri okuyabileceği için faydalıdır.

Nesne Akışları

Nesne akışları, ilkel veri türlerini ve uygulayan nesneleri işler.

Serileştirilebilir

arayüz. Nesne akışları üzerinden gönderilen veriler otomatik olarak serileştirilir ve seri durumdan çıkarılır, bu da karmaşık verilerin aktarılmasını kolaylaştırır. Ancak nesne akışları yalnızca Java ile yazılmış sunucular ve istemcilerle iletişim kurabilir. Ayrıca,

ObjectOutputStream

başlatma üzerine bir başlık gönderir

Giriş Akışı

Başlatma üzerine, başlık alınana kadar yürütmeyi engelleyen diğer tarafın.

adımlar

Java Step1'de bir Ağ Uygulaması Oluşturun
Java Step1'de bir Ağ Uygulaması Oluşturun

Adım 1. Bir sınıf oluşturun

Bir sınıf oluşturun ve istediğiniz gibi adlandırın. Bu yazıda adı geçecek

Ağ UygulamasıÖrnek

genel sınıf NetworkAppExample { }

Java Step2'de bir Ağ Uygulaması Oluşturun
Java Step2'de bir Ağ Uygulaması Oluşturun

Adım 2. Bir ana yöntem oluşturun

Bir ana yöntem oluşturun ve bunun istisnalar oluşturabileceğini beyan edin.

İstisna

type ve bunun herhangi bir alt sınıfı - tüm istisnalar. Bu kötü bir uygulama olarak kabul edilir, ancak barebone örnekleri için kabul edilebilir.

public class NetworkAppExample { public static void main(String args) Exception { } } atar

Java Step3'de bir Ağ Uygulaması Oluşturun
Java Step3'de bir Ağ Uygulaması Oluşturun

Adım 3. Sunucu adresini bildirin

Bu örnekte yerel ana bilgisayar adresi ve isteğe bağlı bir bağlantı noktası numarası kullanılacaktır. Bağlantı noktası numarasının 0 ile 65535 (dahil) aralığında olması gerekir. Ancak, kaçınılması gereken bağlantı noktası numaraları, ayrılmış sistem bağlantı noktaları oldukları için 0 ile 1023 (dahil) arasında değişir.

public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; } }

Java Step4'de bir Ağ Uygulaması Oluşturun
Java Step4'de bir Ağ Uygulaması Oluşturun

Adım 4. Bir sunucu oluşturun

Sunucu, adrese ve bağlantı noktasına bağlıdır ve gelen bağlantıları dinler. Java'da,

SunucuSoketi

sunucu tarafı bitiş noktasını temsil eder ve işlevi yeni bağlantıları kabul etmektir.

SunucuSoketi

bir sunucu ve bir istemci arasındaki bağlantıyı temsil etmediğinden, veri okuma ve gönderme akışları yoktur.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); } }

Java Step5'de bir Ağ Uygulaması Oluşturun
Java Step5'de bir Ağ Uygulaması Oluşturun

Adım 5. Sunucu başlangıcını günlüğe kaydedin

Günlüğe kaydetme amacıyla, sunucunun başlatıldığını konsola yazdırın.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); } }

Java Step6'de bir Ağ Uygulaması Oluşturun
Java Step6'de bir Ağ Uygulaması Oluşturun

Adım 6. Bir müşteri oluşturun

İstemci, bir sunucunun adresine ve bağlantı noktasına bağlıdır ve bağlantı kurulduktan sonra paketleri (mesajları) dinler. Java'da,

Priz

sunucuya bağlı bir istemci tarafı uç noktasını veya (sunucudan) istemciye bir bağlantıyı temsil eder ve diğer uçtaki tarafla iletişim kurmak için kullanılır.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); } }

Java Step7'de bir Ağ Uygulaması Oluşturun
Java Step7'de bir Ağ Uygulaması Oluşturun

Adım 7. Bağlantı girişimini günlüğe kaydedin

Günlüğe kaydetme amacıyla, bağlantının denendiğini konsola yazdırın.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); } }

Java Step8'de bir Ağ Uygulaması Oluşturun
Java Step8'de bir Ağ Uygulaması Oluşturun

Adım 8. Bağlantı kurun

İstemciler, sunucu bağlantıları dinlemedikçe ve kabul etmedikçe, başka bir deyişle, bağlantılar kurmadıkça asla bağlanmayacaktır. Java'da bağlantılar kullanılarak kurulur.

kabul()

yöntemi

SunucuSoketi

sınıf. Yöntem, bir istemci bağlanana kadar yürütmeyi engeller.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); } }

Java Step9'de bir Ağ Uygulaması Oluşturun
Java Step9'de bir Ağ Uygulaması Oluşturun

Adım 9. Kurulan bağlantıyı günlüğe kaydedin

Günlüğe kaydetme amacıyla, sunucu ve istemci arasındaki bağlantının kurulduğunu konsola yazdırın.

java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); } }

Java Step10'de bir Ağ Uygulaması Oluşturun
Java Step10'de bir Ağ Uygulaması Oluşturun

Adım 10. İletişim akışlarını hazırlayın

İletişim akışlar üzerinden yapılır ve bu uygulamada, sunucudan (istemciye) ham akışların (bağlantı) ve istemcinin veri veya nesne akışlarına zincirlenmesi gerekir. Her iki tarafın da aynı akış türünü kullanması gerektiğini unutmayın.

  • Veri akışları

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); } }

  • Nesne akışları

    Birden çok nesne akışı kullanıldığında, giriş akışlarının çıkış akışlarıyla aynı sırada başlatılması gerekir çünkü

    ObjectOutputStream

    diğer tarafa bir başlık gönderir ve

    ObjectInputStream

    başlığı okuyana kadar yürütmeyi engeller.

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); } }

    Yukarıdaki kodda belirtilen sırayı hatırlamak daha kolay olabilir - önce çıkış akışlarını, ardından giriş akışlarını aynı sırayla başlatın. Ancak, nesne akışlarının başlatılması için başka bir sıra şudur:

    ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream());

Java Step11'de bir Ağ Uygulaması Oluşturun
Java Step11'de bir Ağ Uygulaması Oluşturun

Adım 11. İletişimin hazır olduğunu günlüğe kaydedin

Günlüğe kaydetme amacıyla, iletişimin hazır olduğunu konsola yazdırın.

// kod atlandı import java.net. InetAddress; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); // kod atlandı System.out.println("İletişim hazır."); } }

Java Step12'de bir Ağ Uygulaması Oluşturun
Java Step12'de bir Ağ Uygulaması Oluşturun

Adım 12. Bir mesaj oluşturun

Bu uygulamada,

Selam Dünya

metin, sunucuya şu şekilde gönderilecektir:

bayt

veya

Sicim

. Kullanılan akışa bağlı türde bir değişken bildirin. Kullanmak

bayt

veri akışları için ve

Sicim

nesne akışları için.

  • Veri akışları

    Veri akışlarını kullanarak, nesneleri ilkel veri türlerine veya

    Sicim

    . Bu durumda,

    Sicim

    dönüştürülür

    bayt

    kullanarak yazmak yerine

    yazmaBytes()

    resimler veya diğer dosyalar gibi diğer nesnelerle nasıl yapılacağını gösteren yöntem.

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); byte messageOut = "Merhaba Dünya".getBytes(); } }

  • Nesne akışları

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); String messageOut = "Merhaba Dünya"; } }

Java Step13'de bir Ağ Uygulaması Oluşturun
Java Step13'de bir Ağ Uygulaması Oluşturun

Adım 13. Mesajı gönderin

Verilerin tamamen yazıldığından emin olmak için çıktı akışına veri yazın ve akışı boşaltın.

  • Veri akışları

    İlk önce mesajın uzunluğu gönderilmelidir, böylece diğer taraf kaç bayt okuması gerektiğini bilir. Uzunluk ilkel bir tamsayı türü olarak gönderildikten sonra bayt gönderilebilir.

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); byte messageOut = "Merhaba Dünya".getBytes(); clientOut.writeInt(messageOut.length); clientOut.write(messageOut); clientOut.flush(); } }

  • Nesne akışları

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); String messageOut = "Merhaba Dünya"; clientOut.writeObject(messageOut); clientOut.flush(); } }

Java Step14'de bir Ağ Uygulaması Oluşturun
Java Step14'de bir Ağ Uygulaması Oluşturun

Adım 14. Gönderilen mesajı günlüğe kaydedin

Günlüğe kaydetme amacıyla, mesajın gönderildiğini konsola yazdırın.

  • Veri akışları

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); byte messageOut = "Merhaba Dünya".getBytes(); clientOut.writeInt(messageOut.length); clientOut.write(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + new String(messageOut)); } }

  • Nesne akışları

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); String messageOut = "Merhaba Dünya"; clientOut.writeObject(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + messageOut); } }

Java Step15'de Ağ Uygulaması Oluşturun
Java Step15'de Ağ Uygulaması Oluşturun

Adım 15. Mesajı okuyun

Giriş akışındaki verileri okuyun ve dönüştürün. Gönderilen verinin türünü tam olarak bildiğimiz için, ya bir

Sicim

itibaren

bayt

veya döküm

Nesne

ile

Sicim

kullanılan akışa bağlı olarak kontrol etmeden.

  • Veri akışları

    Önce uzunluk, sonra bayt gönderildiği için okuma aynı sırada yapılmalıdır. Uzunluğun sıfır olması durumunda okunacak bir şey yoktur. Baytlar tekrar bir örneğe dönüştürüldüğünde nesnenin serisi kaldırılır, bu durumda

    Sicim

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); byte messageOut = "Merhaba Dünya".getBytes(); clientOut.writeInt(messageOut.length); clientOut.write(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + new String(messageOut)); int uzunluk = serverIn.readInt(); if (uzunluk > 0) { byte messageIn = new byte[uzunluk]; serverIn.readFully(messageIn, 0, messageIn.length); } } }

  • Nesne akışları

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); String messageOut = "Merhaba Dünya"; clientOut.writeObject(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + messageOut); String messageIn = (String) serverIn.readObject(); } }

Java Step16'de bir Ağ Uygulaması Oluşturun
Java Step16'de bir Ağ Uygulaması Oluşturun

Adım 16. Okunan mesajı günlüğe kaydedin

Günlüğe kaydetme amacıyla, mesajın alındığını konsola yazdırın ve içeriğini yazdırın.

  • Veri akışları

    java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); DataOutputStream clientOut = new DataOutputStream(client.getOutputStream()); DataInputStream clientIn = new DataInputStream(client.getInputStream()); DataOutputStream serverOut = new DataOutputStream(connection.getOutputStream()); DataInputStream serverIn = new DataInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); byte messageOut = "Merhaba Dünya".getBytes(); clientOut.writeInt(messageOut.length); clientOut.write(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + new String(messageOut)); int uzunluk = serverIn.readInt(); if (uzunluk > 0) { byte messageIn = new byte[uzunluk]; serverIn.readFully(messageIn, 0, messageIn.length); System.out.println("İstemciden mesaj alındı: " + new String(messageIn)); } } }

  • Nesne akışları

    java.io. ObjectInputStream'i içe aktarın; java.io. ObjectOutputStream'i içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); ObjectOutputStream clientOut = new ObjectOutputStream(client.getOutputStream()); ObjectOutputStream serverOut = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream clientIn = new ObjectInputStream(client.getInputStream()); ObjectInputStream serverIn = new ObjectInputStream(connection.getInputStream()); System.out.println("İletişim hazır."); String messageOut = "Merhaba Dünya"; clientOut.writeObject(messageOut); clientOut.flush(); System.out.println("Sunucuya gönderilen mesaj: " + messageOut); String messageIn = (String) serverIn.readObject(); System.out.println("İstemciden mesaj alındı: " + messageIn); } }

Java Step17'de bir Ağ Uygulaması Oluşturun
Java Step17'de bir Ağ Uygulaması Oluşturun

Adım 17. Bağlantıları kesin

Bir taraf akışlarını kapattığında bağlantı kesilir. Java'da, çıkış akışını kapatarak, ilişkili soket ve giriş akışı da kapatılır. Diğer uçtaki bir taraf bağlantının kesildiğini öğrendiğinde, bellek sızıntılarını önlemek için çıkış akışını da kapatması gerekir.

// kod atlandı import java.net. InetAddress; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); // kod atlandı System.out.println("İletişim hazır."); // kod atlandı clientOut.close(); serverOut.close(); } }

Java Step18 V2'de Ağ Uygulaması Oluşturun
Java Step18 V2'de Ağ Uygulaması Oluşturun

Adım 18. Bağlantı kesilmesini kaydedin

Günlüğe kaydetme amacıyla, konsola yazdırma bağlantılarının bağlantısı kesildi.

// kod atlandı import java.net. InetAddress; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); // kod atlandı System.out.println("İletişim hazır."); // kod atlandı clientOut.close(); serverOut.close(); System.out.println("Bağlantılar kapatıldı."); } }

Java Step19'de bir Ağ Uygulaması Oluşturun
Java Step19'de bir Ağ Uygulaması Oluşturun

Adım 19. Sunucuyu sonlandırın

Bağlantılar kesildi, ancak sunucu hala çalışıyor ve çalışıyor. Olarak

SunucuSoketi

herhangi bir akışla ilişkili değil, çağrılarak açık bir şekilde kapatılması gerekiyor

kapat()

yöntem.

// kod atlandı import java.net. InetAddress; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); // kod atlandı System.out.println("İletişim hazır."); // kod atlandı clientOut.close(); serverOut.close(); System.out.println("Bağlantılar kapatıldı."); sunucu.kapat(); } }

Java Step20'de bir Ağ Uygulaması Oluşturun
Java Step20'de bir Ağ Uygulaması Oluşturun

Adım 20. Sunucu sonlandırmasını günlüğe kaydedin

Günlüğe kaydetme amacıyla, konsol sunucusuna yazdırma işlemi sonlandırıldı.

// kod atlandı import java.net. InetAddress; java.net. ServerSocket'i içe aktarın; java.net. Socket'i içe aktarın; public class NetworkAppExample { public static void main(String args) atar İstisna { String host = "localhost"; int bağlantı noktası = 10430; ServerSocket server = new ServerSocket(port, 50, InetAddress.getByName(host)); System.out.println("Sunucu başlatıldı."); Soket istemcisi = new Socket(host, port); System.out.println("Sunucuya bağlanılıyor…"); Soket bağlantısı = server.accept(); System.out.println("Bağlantı kuruldu."); // kod atlandı System.out.println("İletişim hazır."); // kod atlandı clientOut.close(); serverOut.close(); System.out.println("Bağlantılar kapatıldı."); sunucu.kapat(); System.out.println("Sunucu sonlandırıldı."); } }

Java Step21'de bir Ağ Uygulaması Oluşturun
Java Step21'de bir Ağ Uygulaması Oluşturun

Adım 21. Derleyin ve çalıştırın

Günlüğe kaydetme, uygulamanın başarılı olup olmadığını bilmemizi sağladı. Beklenen çıktı:

Sunucu başladı. Sunucuya bağlanılıyor… Bağlantı kuruldu. İletişim hazır. Sunucuya gönderilen mesaj: Hello World İstemciden alınan mesaj: Hello World Bağlantıları kapatıldı. Sunucu sonlandırıldı.

Çıktınızın yukarıdaki gibi olmaması durumunda, ki bu pek olası değildir, birkaç çözüm vardır:

  • Çıkış hatta durursa

    Bağlantı kuruldu.

    ve nesne akışları kullanılır, her birini yıkayın

    ObjectOutputStream

  • Başlatmadan hemen sonra, çünkü başlıklar nedense gönderilmedi.
  • çıktı yazdırılırsa

    java.net. BindException: Adres zaten kullanımda

  • belirtilen numara zaten kullanıldığından farklı bir bağlantı noktası numarası seçin.

İpuçları

  • Farklı bir ağdaki bir sunucuya bağlanma, yönlendirilmiş bir bağlantı noktasına sahip sunucuyu çalıştıran bir cihazın harici IP adresine bağlanarak yapılır.
  • Aynı ağ üzerinde bir sunucuya bağlanma, sunucuyu çalıştıran bir cihazın özel IP adresine bağlanarak veya bir port ileterek ve cihazın harici IP adresine bağlanarak yapılır.
  • Hamachi gibi farklı bir ağdaki sunucuya bağlantı noktası yönlendirmeden bağlanmaya izin veren yazılımlar vardır, ancak yazılımın her iki cihaza da yüklenmesi gerekir.

Örnekler

Giriş/çıkış engelleme kullanan ağ uygulamalarının iş parçacıkları kullanması gerekir. Aşağıdaki örnekler, iş parçacıkları ile minimalist bir sunucu ve istemci uygulamasını göstermektedir. Ağ oluşturma kodu, bazı snippet'lerin senkronize edilmesi, iş parçacıklarına taşınması ve istisnaların ele alınması dışında, esasen makaledekiyle aynıdır.

sunucu.java

java.io. IOException'ı içe aktarın; java.net. InetAddress'i içe aktarın; java.net. ServerSocket'i içe aktarın; java.net. SocketException'ı içe aktarın; java.net. UnknownHostException'ı içe aktarın; java.util. ArrayList'i içe aktarın; java.util. Collections'ı içe aktarın; java.util. List'i içe aktar; /** * {@code Server} sınıfı, bir ağdaki sunucu uç noktasını temsil eder. {@kod Sunucusu} belirli bir IP * adresine ve bağlantı noktasına bağlandıktan sonra, istemcilerle bağlantı kurar ve onlarla iletişim kurabilir veya bağlantılarını kesebilir. *

* Bu sınıf threadsafedir. * * @sürüm 1.0 * @see Client * @see Bağlantı */ public class Sunucu Runnable { private ServerSocket server; özel Liste bağlantılar; özel Konu iş parçacığı; özel son Nesne bağlantılarıKilit = yeni Nesne(); /** * Belirtilen ana bilgisayar adı ve bağlantı noktasındaki istemcilerle etkileşimde bulunan ve belirtilen * talep edilen maksimum gelen istemci kuyruğu uzunluğuyla etkileşime giren bir {@kod Sunucusu} oluşturur. * * @param host kullanılacak host adresi. * @param bağlantı noktası Kullanılacak bağlantı noktası numarası. * @param backlog Gelen istemcilerin kuyruğunun istenen maksimum uzunluğu. * @throws NetworkException Bir sunucu başlatılırken hata oluşursa. */ public Server(Dize ana bilgisayarı, int bağlantı noktası, int biriktirme listesi) atar NetworkException { try { server = new ServerSocket(port, backlog, InetAddress.getByName(host)); } catch (UnknownHostException e) { throw new NetworkException("Ana bilgisayar adı çözülemedi: " + ana bilgisayar, e); } catch (IllegalArgumentException e) { throw new NetworkException("Port numarası 0 ile 65535 (dahil) arasında olmalıdır): " + port); } catch (IOException e) { throw new NetworkException("Sunucu başlatılamadı.", e); } bağlantılar = Collections.synchronizedList(new ArrayList()); thread = new Thread(this); thread.start(); } /** * Belirtilen ana bilgisayar adı ve bağlantı noktasındaki istemcilerle etkileşime giren bir {@kod Sunucusu} oluşturur. * * @param ana bilgisayar Bağlanacak ana bilgisayar adresi. * @param bağlantı noktası Bağlanacak bağlantı noktası numarası. * @throws NetworkException Bir sunucu başlatılırken hatalar oluşursa. */ public Server(String host, int port) NetworkException { this(host, port, 50); } /** * İstemcilerden gelen bağlantıları dinler, kabul eder ve kaydeder. */ @Override public void run() { while (!server.isClosed()) { try { connection.add(new Connection(server.accept())); } catch (SocketException e) { if (!e.getMessage().equals("Soket kapalı")) { e.printStackTrace(); } } yakalama (NetworkException | IOException e) { e.printStackTrace(); } } } /** * Kayıtlı tüm istemcilere veri gönderir. * * @param data Gönderilecek veriler. * @throws IllegalStateException Sunucu çevrimdışıyken veri yazmaya çalışılırsa. * @throws IllegalArgumentException Gönderilecek veri boşsa. */ public void yayın(Nesne verisi) { if (server.isClosed()) { throw new IllegalStateException("Veri gönderilmedi, sunucu çevrimdışı."); } if (data == null) { yeni IllegalArgumentException("boş veri"); } synchronized (connectionsLock) { for (Bağlantı bağlantısı: bağlantılar) { try { connection.send(data); System.out.println("Veriler istemciye başarıyla gönderildi."); } catch (NetworkException e) { e.printStackTrace(); } } } } /** * Bir bağlantı kesme mesajı gönderir ve belirtilen istemcinin bağlantısını keser. * * @param bağlantı Bağlantısı kesilecek istemci. * @throws NetworkException Bağlantı kapanırken hata oluşursa. */ public void connection (Bağlantı bağlantısı), NetworkException { if (connections.remove(connection)) { connection.close(); } } /** * Tüm istemcilere bağlantı kesme mesajı gönderir, bağlantılarını keser ve sunucuyu sonlandırır. */ public void close(), NetworkException { synchronized (connectionsLock) { for (Bağlantı bağlantısı: bağlantılar) { try { connection.close(); } catch (NetworkException e) { e.printStackTrace(); } } } bağlantılar.clear(); { server.close(); } catch (IOException e) { throw new NetworkException("Sunucu kapatılırken hata oluştu."); } nihayet { thread.interrupt(); } } /** * Sunucunun çevrimiçi olup olmadığını döndürür. * * Sunucu çevrimiçiyse @return True. Yanlış, aksi halde. */ public boolean isOnline() { return !server.isClosed(); } /** * Bir dizi kayıtlı istemci döndürür. */ public Connection getConnections() { synchronized (connectionsLock) { return connection.toArray(new Connection[connections.size()]); } } }

istemci.java

java.io. IOException'ı içe aktarın; java.net. Socket'i içe aktarın; java.net. UnknownHostException'ı içe aktarın; /** * {@code Client} sınıfı, bir ağdaki bir istemci uç noktasını temsil eder. {@kod İstemcisi}, belirli bir * sunucuya bağlandıktan sonra yalnızca sunucuyla iletişim kurabileceği garanti edilir. Diğer istemcilerin verileri * alıp almayacağı, sunucu uygulamasına bağlıdır. *

* Bu sınıf threadsafedir. * * @versiyon 1.0 * @see Sunucu * @see Bağlantı */ genel sınıf İstemci { özel Bağlantı bağlantısı; /** * Belirtilen ana bilgisayar ve bağlantı noktasındaki sunucuya bağlı bir {@kod İstemcisi} oluşturur. * * @param ana bilgisayar Bağlanacak ana bilgisayar adresi. * @param bağlantı noktası Bağlanacak bağlantı noktası numarası. * @throws NetworkException Bir sunucu başlatılırken hata oluşursa. */ public Client(Dize ana bilgisayar, int bağlantı noktası) NetworkException { try { bağlantı = yeni Bağlantı(yeni Soket(ana bilgisayar, bağlantı noktası)); } catch (UnknownHostException e) { throw new NetworkException("Ana bilgisayar adı çözülemedi: " + ana bilgisayar, e); } catch (IllegalArgumentException e) { throw new NetworkException("Port numarası 0 ile 65535 (dahil) arasında olmalıdır): " + port); } catch (IOException e) { throw new NetworkException("Sunucu başlatılamadı.", e); } } /** * Karşı tarafa veri gönderir. * * @param data Gönderilecek veriler. * @throws NetworkException Çıkış akışına yazma başarısız olursa. * @throws IllegalStateException Bağlantı kapatıldığında veri yazılmaya çalışılırsa. * @throws IllegalArgumentException Gönderilecek veri boşsa. * @throws UnsupportedOperationException Desteklenmeyen veri türü gönderilmeye çalışılırsa. */ public void send(Nesne verileri) NetworkException { connection.send(data); } /** * Sunucuya bir bağlantı kesme mesajı gönderir ve sunucuyla olan bağlantıyı kapatır. */ public void close(), NetworkException { connection.close(); } /** * İstemcinin sunucuya bağlı olup olmadığını döndürür. * * İstemci bağlıysa @return True. Yanlış, aksi halde. */ public boolean isOnline() { return connection.isConnected(); } /** * İstemcinin {@link Connection} örneğini döndürür. */ public Bağlantı getConnection() { bağlantıya dönüş; } }

Bağlantı.java

java.io. DataInputStream'i içe aktarın; java.io. DataOutputStream'i içe aktarın; java.io. IOException'ı içe aktarın; java.net. Socket'i içe aktarın; java.net. SocketException'ı içe aktarın; /** * {@code Connection} sınıfı, ya sunucudan istemciye bağlantıyı ya da bir ağdaki istemci uç noktasını temsil eder * {@code Connection}, bağlandıktan sonra, bağlı olarak diğer taraf veya taraflarla veri alışverişi yapabilir. bir sunucuda * uygulama. *

* Bu sınıf threadsafedir. * * @versiyon 1.0 * @see Sunucu * @see İstemci */ public class Bağlantı Çalıştırılabilir { private Socket socket; özel DataOutputStream çıkışı; özel DataInputStream içinde; özel Konu iş parçacığı; özel son Nesne writeLock = yeni Nesne(); özel son Object readLock = new Object(); /** * Belirtilen {@link Socket} akışlarını kullanarak {@code Connection} oluşturur. * * Akışları almak için @param socket Socket.*/ public Connection(Soket soketi), NetworkException { if (socket == null) { yeni IllegalArgumentException("boş soket"); } this.socket = soket; try {out = new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { throw new NetworkException("Çıkış akışına erişilemedi.", e); } { in = new DataInputStream(socket.getInputStream()); deneyin } catch (IOException e) { throw new NetworkException("Giriş akışına erişilemedi.", e); } thread = new Thread(bu); thread.start(); } /** * Karşı tarafla bağlantı devam ederken mesajları okur. */ @Override public void run() { while (!socket.isClosed()) { try { int tanımlayıcı; bayt bayt; senkronize (readLock) { tanımlayıcı = in.readInt(); int uzunluk = in.readInt(); if (uzunluk > 0) { bayt = yeni bayt[uzunluk]; in.readFully(bytes, 0, bytes.length); } başka { devam et; } } switch (tanımlayıcı) { case Identifier. INTERNAL: String komutu = new String(bytes); if (command.equals("bağlantıyı kes")) { if (!socket.isClosed()) { System.out.println("Bağlantıyı kesme paketi alındı."); {kapat()'ı deneyin; } catch (NetworkException e) { dönüş; } } } kırmak; case Identifier. TEXT: System.out.println("Mesaj alındı: " + new String(bytes)); kırmak; varsayılan: System.out.println("Tanınmayan veri alındı."); } } catch (SocketException e) { if (!e.getMessage().equals("Soket kapalı")) { e.printStackTrace(); } } yakalama (IOException e) { e.printStackTrace(); } } } /** * Karşı tarafa veri gönderir. * * @param data Gönderilecek veriler. * @throws NetworkException Çıkış akışına yazma başarısız olursa. * @throws IllegalStateException Bağlantı kapatıldığında veri yazılmaya çalışılırsa. * @throws IllegalArgumentException Gönderilecek veri boşsa. * @throws UnsupportedOperationException Desteklenmeyen veri türü gönderilmeye çalışılırsa. */ public void send(Object data) fırlatır NetworkException { if (socket.isClosed()) { throw new IllegalStateException("Veri gönderilmedi, bağlantı kapatıldı."); } if (data == null) { yeni IllegalArgumentException("boş veri"); } int tanımlayıcı; bayt bayt; if (data instanceof String) { identifier = Identifier. TEXT; bayt = ((Dize) verisi).getBytes(); } else { throw new UnsupportedOperationException("Desteklenmeyen veri türü: " + data.getClass()); } try { synchronized (writeLock) { out.writeInt(tanımlayıcı); out.writeInt(bayt.uzunluk); out.write(bayt); dışarı.flush(); } } catch (IOException e) { throw new NetworkException("Veri gönderilemedi.", e); } } /** * Karşı tarafa bir bağlantı kesme mesajı gönderir ve diğer tarafla olan bağlantıyı kapatır. */ public void close(), NetworkException { if (socket.isClosed()) { throw new IllegalStateException("Bağlantı zaten kapalı."); } deneyin { byte mesaj = "disconnect".getBytes(); senkronize (writeLock) { out.writeInt(Identifier. INTERNAL); out.writeInt(mesaj.uzunluk); out.write(mesaj); dışarı.flush(); } } catch (IOException e) { System.out.println("Bağlantı kesilmesi mesajı gönderilemedi."); } deneyin { senkronize (writeLock) { out.close(); } } catch (IOException e) { throw new NetworkException("Bağlantı kapatılırken hata oluştu.", e); } nihayet { thread.interrupt(); } } /** * Karşı tarafla olan bağlantının canlı olup olmadığını döndürür. * * @return True, eğer bağlantı yaşıyorsa. Yanlış, aksi halde. */ public boolean isConnected() { return !socket.isClosed(); } }

tanımlayıcı.java

/** * {@code Identifier} sınıfı, ağ üzerinden gönderilen verileri * seri hale getirmek ve seri durumdan çıkarmak için {@link Connection} tarafından kullanılan sabitleri içerir. * * @versiyon 1.0 * @see Bağlantı */ public final class Tanımlayıcı { /** * Dahili mesajlar için tanımlayıcı. */ public static final int DAHİLİ = 1; /** * Metin mesajları için tanımlayıcı. */ public static final int METİN = 2; }

NetworkException.java

/** * {@code NetworkException} sınıfı, ağla ilgili bir hatayı gösterir. */ public class NetworkException, İstisna'yı genişletir { /** * Mesajı {@code null} olan bir {@code NetworkException} oluşturur. */ public NetworkException() { } /** * Belirtilen mesajla bir {@code NetworkException} oluşturur. * * @param mesajı Hatayı açıklayan bir mesaj. */ public NetworkException(String mesaj) { super(message); } /** * Belirtilen mesaj ve neden ile bir {@code NetworkException} oluşturur. * * @param mesajı Hatayı açıklayan bir mesaj. * @param neden Bir hata nedeni. */ public NetworkException(Dize mesajı, Atılabilir neden) { super(mesaj, neden); } /** * Belirtilen nedenle bir {@code NetworkException} oluşturur. * * @param neden Bir hata nedeni. */ public NetworkException(Atılabilir neden) { super(neden); } }

KullanımÖrneği.java

/** * {@code UsageExample} sınıfı, {@link Server} ve {@link Client} kullanımını gösterir. Bu örnekte, her segmentin yürütülmesini sağlamak için * {@link Thread#sleep(long)} kullanılmıştır, çünkü hızlı başlatma ve kapatma bazı * segmentlerin yürütülmemesine neden olur. * * @sürüm 1.0 * @see Sunucu * @see İstemci */ public class Kullanım Örneği { public static void main(String args) Exception { String host = "localhost"; int bağlantı noktası = 10430; Sunucu sunucusu = yeni Sunucu (ana bilgisayar, bağlantı noktası); İstemci istemci = yeni İstemci(ana bilgisayar, bağlantı noktası); iplik.uyku(100L); client.send("Merhaba."); server.broadcast("Merhaba dostum!"); iplik.uyku(100L); server.disconnect(server.getConnections()[0]); // veya client.close() ile istemci tarafındaki server.close() bağlantısını kesin; } }

Önerilen: