Ma'lum bir qurilmada bajariladigan kodni yozish juda qoniqarli. Ammo, bir-birlari bilan aloqa o'rnatadigan bir nechta qurilmalarda bajariladigan kodni yozish hayotni tasdiqlaydi. Ushbu maqola sizga uzatishni boshqarish protokoli (TCP) yordamida tarmoq orqali qanday ulanish va xabar almashishni o'rgatadi.
Ushbu maqolada, siz kompyuterni o'ziga bog'laydigan va uni aqldan ozdiradigan - o'zi bilan gaplashadigan dasturni o'rnatasiz. Shuningdek, siz Java -da tarmoq yaratish uchun eng ko'p ishlatiladigan ikkita oqim o'rtasidagi farqni va ularning qanday ishlashini bilib olasiz.
Ma'lumotlar va ob'ektlar oqimi
Kodga kirishdan oldin, maqolada ishlatiladigan ikkita oqim o'rtasidagi farqni ajratib ko'rsatish kerak.
Ma'lumot oqimlari
Ma'lumot oqimlari ibtidoiy ma'lumotlar turlari va satrlarini qayta ishlaydi. Ma'lumot oqimlari orqali yuboriladigan ma'lumotlarni qo'lda ketma -ketlashtirish va ketma -ketlashtirish kerak, bu esa murakkab ma'lumotlarni uzatishni qiyinlashtiradi. Ammo ma'lumotlar oqimi Java -dan boshqa tillarda yozilgan serverlar va mijozlar bilan aloqa o'rnatishi mumkin. Xom -ashyo bu jihatdan ma'lumotlar oqimiga o'xshaydi, lekin ma'lumotlar oqimi ma'lumotlarning platformada mustaqil ravishda formatlanishini ta'minlaydi, bu foydali, chunki ikkala tomon ham yuborilgan ma'lumotlarni o'qiy oladi.
Ob'ekt oqimlari
Ob'ekt oqimlari boshlang'ich ma'lumotlar turlarini va amalga oshiradigan ob'ektlarni qayta ishlaydi
Seriyali
interfeys. Ob'ektlar oqimi orqali yuboriladigan ma'lumotlar avtomatik ravishda ketma -ket va ketma -ketlashtiriladi, bu esa murakkab ma'lumotlarni uzatishni osonlashtiradi. Ammo, ob'ektlar oqimi faqat Java -da yozilgan serverlar va mijozlar bilan aloqa o'rnatishi mumkin. Shuningdek,
ObjectOutputStream
ishga tushirilgandan so'ng, ga sarlavha yuboradi
InputStream
boshlanganda sarlavha olinmaguncha bajarilishini bloklaydigan boshqa tomon.
Qadamlar
Qadam 1. Sinf yarating
Sinf yarating va xohlaganingizcha nom bering. Ushbu maqolada unga nom beriladi
NetworkAppExample
ochiq sinf NetworkAppExample {}
2 -qadam. Asosiy usulni yarating
Asosiy usulni yarating va istisnolardan voz kechishi mumkinligini e'lon qiling
Istisno
turi va uning har qanday kichik klassi - barcha istisnolar. Bu yomon amaliyot deb hisoblanadi, lekin yalang'och misollar uchun qabul qilinadi.
umumiy toifadagi NetworkAppExample {public static void main (String args) istisno qiladi {}}
Qadam 3. Server manzilini e'lon qiling
Bu misolda mahalliy xost manzili va ixtiyoriy port raqami ishlatiladi. Port raqami 0 dan 65535 gacha bo'lishi kerak. Biroq, oldini olish uchun port raqamlari 0 dan 1023 gacha (shu jumladan) oralig'ida, chunki ular tizim portlari himoyalangan.
public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; }}
Qadam 4. Server yaratish
Server manzil va portga bog'langan va kiruvchi ulanishlarni tinglaydi. Java -da,
ServerSocket
server tomonining so'nggi nuqtasini ifodalaydi va uning vazifasi yangi ulanishlarni qabul qilishdir.
ServerSocket
Ma'lumotni o'qish va yuborish uchun oqim yo'q, chunki u server va mijoz o'rtasidagi aloqani anglatmaydi.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); }}
5 -qadam. Log serverining ishga tushishi
Jurnalga kirish uchun server ishga tushirilgan konsolda chop eting.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); }}
Qadam 6. Mijoz yarating
Mijoz server manzili va portiga bog'langan va ulanish o'rnatilgandan so'ng paketlarni (xabarlarni) tinglaydi. Java -da,
Soket
serverga ulangan mijoz tomonining oxirgi nuqtasini yoki mijozga ulanishni (serverdan) ifodalaydi va boshqa tomondan tomon bilan aloqa qilish uchun ishlatiladi.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); }}
Qadam 7. Jurnalga ulanishga urinish
Jurnalga kirish uchun ulanishga urinilganligini konsolga chop eting.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); }}
8 -qadam. Aloqani o'rnating
Mijozlar hech qachon ulanmaydi, agar server tinglamasa va qabul qilmasa, boshqacha aytganda, ulanish o'rnatilmasa. Java -da ulanishlar yordamida o'rnatiladi
qabul ()
usuli
ServerSocket
sinf Usul mijoz ulanmaguncha bajarilishini bloklaydi.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); }}
Qadam 9. O'rnatilgan aloqani qayd eting
Jurnalga kirish uchun server va mijoz o'rtasida aloqa o'rnatilganligini konsolga chop eting.
java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); }}
10 -qadam. Aloqa oqimlarini tayyorlang
Aloqa oqimlar orqali amalga oshiriladi va ushbu dasturda serverdan (mijozdan) va mijozdan (mijozdan) xom oqimlar ham ma'lumotlarga, ham ob'ektlar oqimiga bog'lanishi kerak. Esda tutingki, har ikki tomon ham bir xil oqim turidan foydalanishi kerak.
-
Ma'lumot oqimlari
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); }}
-
Ob'ekt oqimlari
Bir nechta ob'ekt oqimlari ishlatilganda, kirish oqimlarini chiqish oqimlari bilan bir xil tartibda boshlash kerak, chunki
ObjectOutputStream
boshqa tomonga sarlavha yuboradi va
ObjectInputStream
sarlavha o'qilmaguncha bajarishni bloklaydi.
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); }}
Yuqoridagi kodda ko'rsatilgan tartibni eslab qolish osonroq bo'lishi mumkin - birinchi navbatda chiqish oqimlarini, so'ngra kirish oqimlarini xuddi shu tartibda ishga tushiring. Biroq, ob'ekt oqimlarini ishga tushirishning yana bir tartibi quyidagicha:
ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ());
11 -qadam. Aloqa tayyor ekanligini qayd eting
Jurnalga kirish uchun konsolga aloqa tayyor ekanligini chop eting.
// java.net. InetAddress -ga import kiritilmagan; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); // kod qoldirildi System.out.println ("Aloqa tayyor."); }}
12 -qadam. Xabar yarating
Ushbu ilovada,
Salom Dunyo
matn serverga ham yuboriladi
bayt
yoki
Ip
. Amaldagi oqimga bog'liq bo'lgan turdagi o'zgaruvchini e'lon qiling. Foydalanish
bayt
ma'lumotlar oqimi uchun va
Ip
ob'ekt oqimlari uchun.
-
Ma'lumot oqimlari
Ma'lumot oqimlaridan foydalanib, ketma -ketlashtirish ob'ektlarni ibtidoiy ma'lumotlar turiga aylantirish orqali amalga oshiriladi
Ip
. Ushbu holatda,
Ip
ga aylantiriladi
bayt
yordamida yozish o'rniga
writeBytes ()
rasm yoki boshqa fayllar kabi boshqa ob'ektlar bilan qanday ishlashini ko'rsatish usuli.
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); bayt messageOut = "Salom dunyo".getBytes (); }}
-
Ob'ekt oqimlari
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); String messageOut = "Salom dunyo"; }}
13 -qadam Xabarni yuboring
Ma'lumotlarning to'liq yozilganligiga ishonch hosil qilish uchun chiqish oqimiga ma'lumotlarni yozing va oqimni yuving.
-
Ma'lumot oqimlari
Xabarning uzunligini birinchi bo'lib yuborish kerak, shuning uchun boshqa tomon qancha bayt o'qish kerakligini biladi. Uzunlik ibtidoiy tamsayı turi sifatida yuborilgandan so'ng, baytlarni yuborish mumkin.
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); bayt messageOut = "Salom dunyo".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); }}
-
Ob'ekt oqimlari
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Istisno {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); String messageOut = "Salom dunyo"; clientOut.writeObject (messageOut); clientOut.flush (); }}
14 -qadam. Yuborilgan xabarni kiriting
Jurnalga kirish uchun, xabar yuborilgan konsolga chop eting.
-
Ma'lumot oqimlari
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); bayt messageOut = "Salom dunyo".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + yangi String (messageOut)); }}
-
Ob'ekt oqimlari
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); String messageOut = "Salom dunyo"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + messageOut); }}
15 -qadam Xabarni o'qing
Kirish oqimidan ma'lumotlarni o'qing va aylantiring. Biz yuborilgan ma'lumotlarning turini aniq bilganimiz uchun, biz ham
Ip
dan
bayt
yoki aktyor
Ob'ekt
ga
Ip
tekshirilmasdan, ishlatiladigan oqimga bog'liq.
-
Ma'lumot oqimlari
Birinchi uzunlik va keyin bayt yuborilganligi sababli, o'qish xuddi shu tartibda bajarilishi kerak. Agar uzunlik nol bo'lsa, o'qiladigan hech narsa yo'q. Agar baytlar namunaga aylantirilsa, bu holda of
Ip
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); bayt messageOut = "Salom dunyo".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + yangi String (messageOut)); int uzunligi = serverIn.readInt (); if (uzunlik> 0) {bayt messageIn = yangi bayt [uzunlik]; serverIn.readFully (messageIn, 0, messageIn.length); }}}
-
Ob'ekt oqimlari
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); String messageOut = "Salom dunyo"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + messageOut); String messageIn = (String) serverIn.readObject (); }}
16 -qadam. Jurnalni o'qish xabari
Jurnalga kirish uchun konsolga xabar qabul qilinganligini va uning mazmunini chop eting.
-
Ma'lumot oqimlari
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); DataOutputStream clientOut = yangi DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = yangi DataInputStream (client.getInputStream ()); DataOutputStream serverOut = yangi DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = yangi DataInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); bayt messageOut = "Salom dunyo".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + yangi String (messageOut)); int uzunligi = serverIn.readInt (); if (uzunlik> 0) {bayt messageIn = yangi bayt [uzunlik]; serverIn.readFully (messageIn, 0, messageIn.length); System.out.println ("Mijozdan xabar olindi:" + yangi String (messageIn)); }}}
-
Ob'ekt oqimlari
java.io. ObjectInputStream -ni import qilish; java.io. ObjectOutputStream -ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); ObjectOutputStream clientOut = yangi ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = yangi ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = yangi ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = yangi ObjectInputStream (connection.getInputStream ()); System.out.println ("Aloqa tayyor."); String messageOut = "Salom dunyo"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Xabar serverga yuborildi:" + messageOut); String messageIn = (String) serverIn.readObject (); System.out.println ("Mijozdan olingan xabar:" + messageIn); }}
17 -qadam. Ulanishlarni uzing
Bir tomon o'z oqimlarini yopganda, aloqa uziladi. Java -da, chiqish oqimini yopish orqali, ulangan soket va kirish oqimi ham yopiladi. Boshqa tarafdan ulanish o'chib qolganini bilib, xotira sızıntısının oldini olish uchun, chiqish oqimini yopish kerak.
// java.net. InetAddress -ga import kiritilmagan; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); // kod qoldirildi System.out.println ("Aloqa tayyor."); // kod qoldirildi clientOut.close (); serverOut.close (); }}
18 -qadam. Jurnalni uzish
Jurnalga kirish uchun konsolda chop etish ulanishlari uzilgan.
// java.net. InetAddress -ga import kiritilmagan; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); // kod qoldirildi System.out.println ("Aloqa tayyor."); // kod qoldirildi clientOut.close (); serverOut.close (); System.out.println ("Aloqa yopildi."); }}
19 -qadam. Serverni to'xtating
Ulanish uzilgan, lekin server hali ham ishlamoqda. Kabi
ServerSocket
hech qanday oqim bilan bog'liq emas, uni qo'ng'iroq qilib aniq yopish kerak
yopish ()
usul.
// java.net. InetAddress -ga import kiritilmagan; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); // kod qoldirildi System.out.println ("Aloqa tayyor."); // kod qoldirildi clientOut.close (); serverOut.close (); System.out.println ("Aloqa yopildi."); server.close (); }}
20 -qadam. Log serverini to'xtatish
Jurnalga kirish uchun konsol serveriga chop etish to'xtatildi.
// java.net. InetAddress -ga import kiritilmagan; java.net. ServerSocket -ni import qilish; java.net. Socket -ni import qilish; public class NetworkAppExample {public static void main (String args) tashlaydi Exception {String host = "localhost"; int port = 10430; ServerSocket server = yangi ServerSocket (port, 50, InetAddress.getByName (xost)); System.out.println ("Server ishga tushdi."); Socket mijoz = yangi Socket (host, port); System.out.println ("Serverga ulanmoqda …"); Soket aloqasi = server.accept (); System.out.println ("Aloqa o'rnatildi."); // kod qoldirildi System.out.println ("Aloqa tayyor."); // kod qoldirildi clientOut.close (); serverOut.close (); System.out.println ("Aloqa yopildi."); server.close (); System.out.println ("Server to'xtatildi."); }}
21 -qadam. Kompilyatsiya qiling va ishga tushiring
Yozuvlar bizga dastur muvaffaqiyatli yoki yo'qligini bilish imkonini berdi. Kutilayotgan chiqish:
Server ishga tushdi. Serverga ulanmoqda… Ulanish o'rnatildi. Aloqa tayyor. Serverga yuborilgan xabar: Salom Dunyo Mijozdan xabar keldi: Hello World Connections yopildi. Server to'xtatildi.
Agar sizning chiqishingiz yuqoridagi kabi bo'lmasa, ehtimol, bir nechta echim bor:
-
Agar chiqish chiziqda to'xtasa
Aloqa o'rnatildi.
va ob'ekt oqimlari ishlatiladi, har birini yuving
ObjectOutputStream
- sarlavhalar, negadir, yuborilmagani uchun, ishga tushirilgandan so'ng.
-
Agar chiqish chop etilsa
java.net. BindException: Manzil allaqachon ishlatilgan
- boshqa port raqamini tanlang, chunki ko'rsatilgan raqam allaqachon ishlatilgan.
Maslahatlar
- Boshqa tarmoqdagi serverga ulanish, uzatilgan portga ega bo'lgan server ishlaydigan qurilmaning tashqi IP -manziliga ulanish orqali amalga oshiriladi.
- Xuddi shu tarmoqdagi serverga ulanish server bilan ishlaydigan qurilmaning shaxsiy IP -manziliga ulanish yoki portni qayta yo'naltirish va qurilmaning tashqi IP -manziliga ulanish orqali amalga oshiriladi.
- Hamachi kabi dasturlar bor, ular portni uzatmasdan serverga boshqa tarmoqqa ulanish imkonini beradi, lekin bu ikkala qurilmada ham dasturiy ta'minotni o'rnatishni talab qiladi.
Misollar
Tarmoq ilovalari blokirovka qiluvchi kirish/chiqishni ishlatishi kerak. Quyidagi misollar minimalist server va mijozlar tomonidan bajarilishini ko'rsatadi. Tarmoq kodi, asosan, maqoladagi bilan bir xil, faqat ba'zi parchalar sinxronlanmagan, tarmoqlarga ko'chirilgan va istisnolar ko'rib chiqilgan.
Server.java
java.io. IOException ni import qilish; java.net. InetAddress -ni import qilish; java.net. ServerSocket -ni import qilish; java.net. SocketException ni import qilish; java.net. UnknownHostException ni import qilish; java.util. ArrayList -ni import qilish; java.util. Collections ni import qilish; java.util. List -ni import qilish; /*** {@code Server} klassi tarmoqdagi serverning oxirgi nuqtasini ifodalaydi. {@code Server} bir marta ma'lum bir IP * manzil va portga bog'langan, mijozlar bilan aloqa o'rnatadi va ular bilan aloqa o'rnatishi yoki uzib qo'yishi mumkin. *
* Bu sinf xavfsiz. * * @version 1.0 * @see Client * @see Connection */ public class Server Runnable {private ServerSocket serverini amalga oshiradi; shaxsiy ro'yxat
ulanishlar; xususiy mavzu; xususiy yakuniy Ob'ekt ConnectionsLock = new Object (); /** * Belgilangan xost nomi va portidagi mijozlar bilan o'zaro aloqada bo'ladigan {@code Server} tuzadi, kiruvchi mijozlar navbatining so'ralgan maksimal uzunligi. * * @param host Xost manzilidan foydalanish. * @param port Foydalanish uchun port raqami. * @param backlog Kiruvchi mijozlar navbatining maksimal uzunligini so'radi. * @throws NetworkException Agar serverni ishga tushirishda xatolik yuz bersa. */ umumiy server (String host, int port, int backlog) NetworkException -ni chiqaradi {try {server = new ServerSocket (port, backlog, InetAddress.getByName (host))); } catch (UnknownHostException e) {new NetworkException tashlash ("Xost nomini hal qilib bo'lmadi:" + xost, e); } catch (IllegalArgumentException e) {new NetworkException tashlash ("Port raqami 0 dan 65535 gacha bo'lishi kerak (shu jumladan):" + port); } catch (IOException e) {new NetworkException tashlash ("Serverni ishga tushirib bo'lmadi.", e); } ulanishlar = Collections.synchronizedList (yangi ArrayList ()); thread = new Thread (bu); thread.start (); } /*** Belgilangan xost nomi va portida mijozlar bilan o'zaro aloqada bo'ladigan {@code Server} tuzadi. * * @param host Xost manzilini bog'lash. * @param port Bog'lanish uchun port raqami. * @throws NetworkException Agar serverni ishga tushirishda xatolar yuzaga kelsa. */ public server (String host, int port) NetworkException ni chiqaradi {bu (xost, port, 50); } /*** Mijozlarning kiruvchi ulanishlarini tinglaydi, qabul qiladi va ro'yxatdan o'tkazadi. */ @Override public void run () {while (! Server.isClosed ()) {try {Connections.add (new Connection (server.accept ()))); } catch (SocketException e) {if (! e.getMessage (). teng ("Soket yopiq")) {e.printStackTrace (); }} catch (NetworkException | IOException e) {e.printStackTrace (); }}} /*** Ma'lumotlarni barcha ro'yxatdan o'tgan mijozlarga yuboradi. * * @param ma'lumotlari Yuboriladigan ma'lumotlar. * @throws IllegalStateException Agar server oflaynda bo'lsa, ma'lumotlarni yozishga harakat qilinadi. * @throws IllegalArgumentException Agar yuboriladigan ma'lumotlar null bo'lsa. */ public void eshittirish (Ob'ekt ma'lumotlari) {if (server.isClosed ()) {new IllegalStateException tashlash ("Ma'lumotlar yuborilmadi, server oflaynda."); } if (data == null) {new IllegalArgumentException ("null data") tashlash; } sinxronlangan (ConnectionsLock) {uchun (Ulanish aloqasi: ulanishlar) {harakat qilib ko'ring {connection.send (ma'lumotlar); System.out.println ("Ma'lumotlar mijozga muvaffaqiyatli yuborildi."); } catch (NetworkException e) {e.printStackTrace (); }}}} /*** O'chirish xabarini yuboradi va ko'rsatilgan mijozni uzadi. * * @param ulanishi Mijoz aloqani uzadi. * @throws NetworkException Agar ulanishni yopishda xatolik yuz bersa. */ public void disconnect (Connection connection) NetworkException ni chiqaradi {if (Connections.remove (connection)) {connection.close (); }} /*** Barcha mijozlarga uzilish xabarini yuboradi, ularni uzadi va serverni to'xtatadi. */ public void close () NetworkException {synchronized (connectionLock) {for (Connection connection: Connections) {try {connection.close (); } catch (NetworkException e) {e.printStackTrace (); }}} ulanishlar. aniq (); {server.close () ni sinab ko'ring; } catch (IOException e) {new NetworkException tashlash ("Serverni yopishda xato."); } nihoyat {thread.interrupt (); }} /*** Server onlayn yoki yo'qligini qaytaradi. * * @return True, agar server onlayn bo'lsa. Yolg'on, aks holda. */ public boolean isOnline () {return! server.isClosed (); } /*** Ro'yxatdan o'tgan mijozlar qatorini qaytaradi. */ public Connection getConnections () {synchronized (ConnectionsLock) {return links.toArray (new Connection [Connections.size ()])); }}}
Mijoz.java
java.io. IOException ni import qilish; java.net. Socket -ni import qilish; java.net. UnknownHostException ni import qilish; /*** {@code Client} klassi tarmoqdagi mijozning oxirgi nuqtasini ifodalaydi. {@code Client}, ma'lum bir * serverga ulangandan so'ng, faqat server bilan aloqa qila oladi. Boshqa mijozlar ma'lumotni olishlari yoki olmasliklari * serverning bajarilishiga bog'liq. *
* Bu sinf xavfsiz. * * @version 1.0 * @see Server * @see Connection */ umumiy sinf mijozi {private Connection connection; /*** Belgilangan xost va portda serverga ulangan {@code Client} tuzadi. * * @param host Xost manzilini bog'lash. * @param port Bog'lanish uchun port raqami. * @throws NetworkException Agar serverni ishga tushirishda xatolik yuz bersa. */ public Client (String host, int port) NetworkException -ni chiqaradi {try {connection = new Connection (new Socket (host, port))); } catch (UnknownHostException e) {new NetworkException tashlash ("Xost nomini hal qilib bo'lmadi:" + xost, e); } catch (IllegalArgumentException e) {new NetworkException tashlash ("Port raqami 0 dan 65535 gacha bo'lishi kerak (shu jumladan):" + port); } catch (IOException e) {new NetworkException tashlash ("Serverni ishga tushirib bo'lmadi.", e); }} /*** Ma'lumotni boshqa tomonga yuboradi. * * @param ma'lumotlari Yuboriladigan ma'lumotlar. * @throws NetworkException Chiqish oqimiga yozish muvaffaqiyatsiz bo'lsa. * @throws IllegalStateException Agar ulanish yopilganda ma'lumotlarni yozishga urinilsa. * @throws IllegalArgumentException Agar yuboriladigan ma'lumotlar null bo'lsa. * @throws UnsupportedOperationException Agar qo'llab -quvvatlanmaydigan ma'lumotlar turini yuborishga urinilsa. */ public void send (Object data) yuboradi NetworkException {connection.send (ma'lumotlar); } /*** Serverga uzilish xabarini yuboradi va u bilan aloqani yopadi. */ public void close () NetworkException {connection.close () ni tashlaydi; } /*** Mijoz serverga ulanganmi yoki yo'qligini qaytaradi. * * @return True, agar mijoz ulangan bo'lsa. Yolg'on, aks holda. */ public boolean isOnline () {return connection.isConnected (); } /*** Mijozning {@link Connection} misolini qaytaradi. */ public Connection getConnection () {qaytish aloqasi; }}
Ulanish.java
java.io. DataInputStream -ni import qilish; java.io. DataOutputStream -ni import qilish; java.io. IOException ni import qilish; java.net. Socket -ni import qilish; java.net. SocketException ni import qilish; /** * {@code Connection} klassi serverdan mijozga yoki tarmoqdagi mijozning oxirgi nuqtasini ifodalaydi * {@code Connection}, ulangandan so'ng, boshqa tomonlar yoki tomonlar bilan ma'lumot almashishi mumkin. server * dasturida. *
* Bu sinf xavfsiz. * * @version 1.0 * @see Server * @see Client */ public class Connection Runnable {private socket socket; Maxsus DataOutputStream chiqishi; Maxsus DataInputStream; xususiy mavzu; private final Object writeLock = new Object (); private final Object readLock = new Object (); /*** Belgilangan {@link Socket} oqimlari yordamida {@code Connection} ni quradi. * * @param soket - oqimlarni olish uchun soket.*/ public Connection (Socket socket) NetworkException ni chiqaradi {if (socket == null) {new IllegalArgumentException ("null socket")); } this.socket = soket; {out = new DataOutputStream (socket.getOutputStream ()) ni sinab ko'ring; } catch (IOException e) {new NetworkException tashlash ("Chiqish oqimiga kira olmadi.", e); } harakat qilib ko'ring {in = yangi DataInputStream (socket.getInputStream ()); } catch (IOException e) {new NetworkException tashlash ("Kirish oqimiga kira olmadi.", e); } thread = yangi mavzu (bu); thread.start (); } /*** Boshqa tomon bilan aloqa mavjud bo'lganda xabarlarni o'qiydi. */ @Override public void run () {while (! Socket.isClosed ()) {try {int identifikatori; bayt bayt; sinxronlashtirilgan (readLock) {identifikator = in.readInt (); int uzunligi = in.readInt (); if (uzunlik> 0) {bayt = yangi bayt [uzunlik]; in.readFully (baytlar, 0, baytlar uzunligi); } boshqa {davom ettirish; }} switch (identifikator) {case Identifier. INTERNAL: String buyrug'i = yangi String (bayt); if (command.equals ("ajratish"))) {if (! socket.isClosed ()) {System.out.println ("O'chirish paketi qabul qilindi."); harakat qilib ko'ring {close (); } catch (NetworkException e) {qaytish; }}} tanaffus; case Identifier. TEXT: System.out.println ("Xabar qabul qilindi:" + yangi satr (bayt)); tanaffus; standart: System.out.println ("Tanib olinmagan ma'lumotlar qabul qilindi."); }} catch (SocketException e) {if (! e.getMessage (). teng ("Soket yopiq")) {e.printStackTrace (); }} catch (IOException e) {e.printStackTrace (); }}} /*** Ma'lumotni boshqa tomonga yuboradi. * * @param ma'lumotlari Yuboriladigan ma'lumotlar. * @throws NetworkException Chiqish oqimiga yozish muvaffaqiyatsiz bo'lsa. * @throws IllegalStateException Agar ulanish yopilganda ma'lumotlarni yozishga urinilsa. * @throws IllegalArgumentException Agar yuboriladigan ma'lumotlar null bo'lsa. * @throws UnsupportedOperationException Agar qo'llab -quvvatlanmaydigan ma'lumotlar turini yuborishga urinilsa. */ public void send (Ob'ekt ma'lumotlari) NetworkException ni tashlaydi {if (socket.isClosed ()) {tashlash new IllegalStateException ("Ma'lumotlar yuborilmagan, ulanish yopilgan."); } if (data == null) {new IllegalArgumentException ("null data") tashlash; } int identifikatori; bayt bayt; if (ma'lumotlar misoli String) {identifikator = Identifier. TEXT; bayt = ((String) ma'lumotlar).getBytes (); } else {new UnsupportedOperationException tashlash ("Qo'llab -quvvatlanmaydigan ma'lumotlar turi:" + data.getClass ()); } harakat qilib ko'ring {synchronized (writeLock) {out.writeInt (identifikator); out.writeInt (bayt.length); out.write (baytlar); out.flush (); }} catch (IOException e) {new NetworkException tashlash ("Ma'lumot yuborib bo'lmadi.", e); }} /*** Boshqa tomonga uzilish xabarini yuboradi va u bilan aloqani yopadi. */ public void close () NetworkException {if (socket.isClosed ()) {tashlash new IllegalStateException ("Ulanish allaqachon yopilgan.") ni chiqaradi; } harakat qilib ko'ring {byte message = "disconnect".getBytes (); sinxronlashtirilgan (writeLock) {out.writeInt (Identifier. INTERNAL); out.writeInt (message.length); out.write (xabar); out.flush (); }} catch (IOException e) {System.out.println ("Aloqa xabarini yuborib bo'lmadi."); } harakat qilib ko'ring {synchronized (writeLock) {out.close (); }} catch (IOException e) {new NetworkException tashlash ("Ulanishni yopishda xato.", e); } nihoyat {thread.interrupt (); }} /*** Boshqa tomon bilan aloqa mavjud yoki yo'qligini qaytaradi. * * @Return rost, agar ulanish tirik bo'lsa. Yolg'on, aks holda. */ public boolean isConnected () {return! socket.isClosed (); }}
Identifikator.java
/** * {@code Identifier} sinfida {@link Connection} tomonidan tarmoq orqali yuborilgan ma'lumotlarni * ketma -ketlashtirish va ketma -ketlashtirish uchun ishlatiladigan doimiylar mavjud. * * @version 1.0 * @seloling * / umumiy yakuniy sinf identifikatori { / ** * ichki xabarlar uchun identifikator. */ public static final int INTERNAL = 1; /*** Matnli xabarlar uchun identifikator. */ public static final int TEXT = 2; }
NetworkException.java
/*** {@code NetworkException} klassi tarmoq bilan bog'liq xatoni bildiradi. * / public class NetworkException Exception kengaytiradi { / *** Xabar sifatida {@code null} bo'lgan {@code NetworkException} tuzadi. * / public NetworkException () {} / *** Belgilangan xabar bilan {@code NetworkException} tuzadi. * * @param xabari Xatoni tavsiflovchi xabar. */ public NetworkException (String xabar) {super (xabar); } /*** Belgilangan xabar va sabab bilan {@code NetworkException} tuzadi. * * @param xabari Xatoni tavsiflovchi xabar. * @param sabab Xato sababi. */ public NetworkException (String message, Throwable sabab) {super (xabar, sabab); } /*** Belgilangan sabab bilan {@code NetworkException} tuzadi. * * @param sabab Xato sababi. */ public NetworkException (Throwable sabab) {super (sabab); }}
Foydalanish namunasi.java
/*** {@code UsageExample} sinfida {@link Server} va {@link Client} ilovalari ko'rsatilgan. Bu misollar har bir segment bajarilishini ta'minlash uchun * {@link Thread#sleep (long)} dan foydalanadi, chunki tez boshlanishi va yopilishi ba'zi * segmentlar bajarilmasligiga olib keladi. * * @version 1.0 * @see Server * @see Client */ public class UsageExample {public static void main (String args) Exception {String host = "localhost"; int port = 10430; Server serveri = yangi server (xost, port); Mijoz -mijoz = yangi mijoz (xost, port); Thread.sleep (100L); client.send ("Salom."); server.broadcast ("Hey, yigit!"); Thread.sleep (100L); server.disconnect (server.getConnections () [0]); // yoki client.close () mijoz tomonidagi serverdan uzish uchun.close (); }}