Java дээр сүлжээний програмыг хэрхэн үүсгэх (зурагтай)

Агуулгын хүснэгт:

Java дээр сүлжээний програмыг хэрхэн үүсгэх (зурагтай)
Java дээр сүлжээний програмыг хэрхэн үүсгэх (зурагтай)

Видео: Java дээр сүлжээний програмыг хэрхэн үүсгэх (зурагтай)

Видео: Java дээр сүлжээний програмыг хэрхэн үүсгэх (зурагтай)
Видео: 🍎iPhone утсан дээр таны заавал мэдэх ёстой 10 зүйл #1 2024, May
Anonim

Тодорхой төхөөрөмж дээр ажилладаг код бичих нь маш сэтгэл ханамжтай байдаг. Гэхдээ бие биетэйгээ харилцдаг хэд хэдэн төхөөрөмж дээр ажилладаг код бичих нь амьдралыг баталгаажуулдаг. Энэ нийтлэл нь дамжуулах хяналтын протокол (TCP) ашиглан сүлжээгээр хэрхэн холбогдох, мессеж солилцох талаар танд заах болно.

Энэ нийтлэлд та өөрийн компьютерийг өөртөө холбож, үндсэндээ галзуурах програмыг өөрөө тохируулах болно. Та Java дээр сүлжээнд хамгийн өргөн хэрэглэгддэг хоёр урсгалын хоорондох ялгаа, хэрхэн ажилладаг талаар мэдэх болно.

Өгөгдөл ба объектын урсгал

Код руу шумбахаас өмнө нийтлэлд ашигласан хоёр урсгалын ялгааг ялгах хэрэгтэй.

Өгөгдлийн урсгал

Мэдээллийн урсгал нь анхны өгөгдлийн төрөл, мөрийг боловсруулдаг. Мэдээллийн урсгалаар дамжуулж буй өгөгдлийг гараар сериалжуулж, цуцлах шаардлагатай бөгөөд энэ нь нарийн төвөгтэй өгөгдөл дамжуулахад хүндрэл учруулдаг. Гэхдээ өгөгдлийн урсгал нь Java -аас бусад хэл дээр бичигдсэн серверүүд болон үйлчлүүлэгчидтэй харилцах боломжтой. Түүхий дамжуулалт нь өгөгдлийн урсгалтай ижил төстэй боловч өгөгдлийн урсгал нь өгөгдлийг платформоос хараат бус хэлбэрээр форматлах боломжийг олгодог бөгөөд энэ нь хоёулаа илгээсэн өгөгдлийг унших боломжтой байдаг.

Объектын урсгал

Объектын урсгал нь өгөгдлийн анхны төрөл, хэрэгжүүлж буй объектуудыг боловсруулдаг

Цуврал болгох боломжтой

интерфэйс. Объектын урсгалаар дамжуулж буй өгөгдлийг автоматаар сериалжуулж, цуцалдаг бөгөөд энэ нь нарийн төвөгтэй өгөгдөл дамжуулахад хялбар болгодог. Гэхдээ объектын урсгал нь зөвхөн Java дээр бичигдсэн серверүүд болон үйлчлүүлэгчидтэй харилцах боломжтой. Мөн,

ObjectOutputStream

эхлүүлсний дараа толгой руу толгой руу илгээдэг

InputStream

эхлүүлэх үед толгойг хүлээн авах хүртэл гүйцэтгэлийг хориглодог нөгөө талын.

Алхам

Java дээр сүлжээний програм үүсгэх Step1
Java дээр сүлжээний програм үүсгэх Step1

Алхам 1. Анги үүсгэнэ үү

Анги үүсгээд хүссэнээрээ нэрлээрэй. Энэ нийтлэлд үүнийг нэрлэх болно

NetworkAppExample

нийтийн ангийн NetworkAppExample {}

Java дээр сүлжээний програм үүсгэх Step2
Java дээр сүлжээний програм үүсгэх Step2

Алхам 2. Үндсэн аргыг бий болгох

Үндсэн аргыг үүсгэж, үл хамаарах зүйлүүд гарч болзошгүй гэж мэдэгдээрэй

Үл хамаарах зүйл

төрөл ба түүний ямар ч дэд анги - бүх үл хамаарах зүйлүүд. Энэ нь муу практик гэж тооцогддог боловч нүцгэн ясны жишээн дээр хүлээн зөвшөөрөгддөг.

public class NetworkAppExample {public static void main (String args) онцгой тохиолдлуудыг шиддэг {}}

Java дээр сүлжээний програм үүсгэх Step3
Java дээр сүлжээний програм үүсгэх Step3

Алхам 3. Серверийн хаягийг тунхаглах

Энэ жишээнд локал хост хаяг болон дурын портын дугаарыг ашиглах болно. Порт дугаар 0 -ээс 65535 хүртэл байх ёстой. Гэсэн хэдий ч зайлсхийх ёстой портын дугаарууд нь 0 -ээс 1023 (хамааруулсан) хооронд хэлбэлздэг, учир нь тэдгээр нь системийн портууд юм.

public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; }}

Java дээр сүлжээний програм үүсгэх Step4
Java дээр сүлжээний програм үүсгэх Step4

Алхам 4. Сервер үүсгэх

Сервер нь хаяг, порт руу холбогдсон бөгөөд ирж буй холболтуудыг сонсдог. Java дээр,

ServerSocket

нь сервер талын төгсгөлийн цэгийг илэрхийлдэг бөгөөд түүний үүрэг бол шинэ холболтыг хүлээн авах явдал юм.

ServerSocket

сервер болон үйлчлүүлэгчийн хоорондох холболтыг илэрхийлдэггүй тул өгөгдлийг унших, илгээх урсгал байдаггүй.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); }}

Java дээр сүлжээний програм үүсгэх Step5
Java дээр сүлжээний програм үүсгэх Step5

Алхам 5. Бүртгэлийн серверийн эхлэл

Бүртгэлийн зорилгоор серверийг эхлүүлсэн консол дээр хэвлэ.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); }}

Java дээр сүлжээний програм үүсгэх Step6
Java дээр сүлжээний програм үүсгэх Step6

Алхам 6. Үйлчлүүлэгч бий болгох

Үйлчлүүлэгч нь серверийн хаяг, порт руу холбогдсон бөгөөд холболт хийгдсэний дараа пакет (мессеж) -ийг сонсдог. Java дээр,

Сокет

нь серверт холбогдсон клиент талын төгсгөлийн цэг эсвэл үйлчлүүлэгчтэй (серверээс) холболтыг илэрхийлдэг бөгөөд нөгөө талаас талтай харилцахад ашиглагддаг.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); }}

Java Step7 дээр сүлжээний програм үүсгэх
Java Step7 дээр сүлжээний програм үүсгэх

Алхам 7. Бүртгэлд холбогдох оролдлого

Бүртгэлийн зорилгоор холболт хийхийг оролдсон тухай консол дээр хэвлэ.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); }}

Java Step8 дээр сүлжээний програм үүсгэх
Java Step8 дээр сүлжээний програм үүсгэх

Алхам 8. Холбоо тогтоох

Серверийг сонсож, хүлээж авахгүй, өөрөөр хэлбэл холболт тогтоохгүй бол үйлчлүүлэгчид хэзээ ч холбогдохгүй. Java дээр холболтыг ашиглан хийдэг

хүлээн зөвшөөрөх ()

-ийн арга

ServerSocket

анги. Энэ арга нь үйлчлүүлэгч холбогдох хүртэл гүйцэтгэлийг хаах болно.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); }}

Java Step9 дээр сүлжээний програм үүсгэх
Java Step9 дээр сүлжээний програм үүсгэх

Алхам 9. Тогтсон холболтыг бүртгэх

Бүртгэлийн зорилгоор сервер ба үйлчлүүлэгч хоёрын хооронд холбоо тогтоосон тухай консол дээр хэвлэ.

java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); }}

Java Step10 дээр сүлжээний програм үүсгэх
Java Step10 дээр сүлжээний програм үүсгэх

Алхам 10. Харилцааны урсгалыг бэлтгэ

Харилцаа холбоо нь дамжуулалтаар хийгддэг бөгөөд энэ аппликешнд сервер (үйлчлүүлэгчээс) болон үйлчлүүлэгчийн түүхий дамжуулалтыг өгөгдөл эсвэл объектын урсгалд гинжлэх шаардлагатай байдаг. Хоёр тал хоёулаа ижил төрлийн урсгалыг ашиглах ёстой гэдгийг санаарай.

  • Өгөгдлийн урсгал

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); }}

  • Объектын урсгал

    Олон объектын урсгалыг ашиглах үед оролтын урсгалыг гаралтын урсгалтай ижил дарааллаар эхлүүлэх шаардлагатай болдог

    ObjectOutputStream

    нөгөө тал руу толгой илгээдэг ба

    ObjectInputStream

    толгойг унших хүртэл гүйцэтгэлийг блоклодог.

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); }}

    Дээрх кодод заасан дарааллыг санах нь илүү хялбар байж магадгүй - эхлээд гаралтын урсгалыг эхлүүлж, дараа нь оролтын урсгалыг ижил дарааллаар эхлүүлнэ үү. Гэсэн хэдий ч объектын урсгалыг эхлүүлэх өөр нэг захиалга нь дараах байдалтай байна.

    ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ());

Java дээр сүлжээний програм үүсгэх Step11
Java дээр сүлжээний програм үүсгэх Step11

Алхам 11. Харилцаа холбоо бэлэн болсныг тэмдэглэ

Бүртгэлийн зорилгоор харилцаа холбоо бэлэн байгаа эсэхийг консол дээр хэвлэ.

// java.net. InetAddress импортыг оруулаагүй болно; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); // кодыг орхигдуулсан System.out.println ("Харилцаа холбоо бэлэн байна."); }}

Java дээр сүлжээний програм үүсгэх Step12
Java дээр сүлжээний програм үүсгэх Step12

Алхам 12. Зурвас үүсгэх

Энэхүү програмд,

Сайн уу Дэлхий

текстийг сервер рүү илгээнэ

байт

эсвэл

Мөр

. Ашиглаж буй урсгалаас хамаарах төрлийн хувьсагчийг зарлах. Хэрэглэх

байт

мэдээллийн урсгалын хувьд болон

Мөр

объектын урсгалын хувьд.

  • Өгөгдлийн урсгал

    Өгөгдлийн урсгалыг ашиглан сериалжуулалтыг объектуудыг энгийн өгөгдлийн төрөл болгон хувиргах замаар хийдэг

    Мөр

    . Энэ тохиолдолд,

    Мөр

    руу хөрвүүлэгддэг

    байт

    ашиглан бичихийн оронд

    writeBytes ()

    Үүнийг зураг эсвэл бусад файл гэх мэт бусад объектуудаар хэрхэн яаж хийхийг харуулах арга.

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); байт messageOut = "Сайн уу ертөнц".getBytes (); }}

  • Объектын урсгал

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); String messageOut = "Сайн уу ертөнц"; }}

Java дээр сүлжээний програм үүсгэх Step13
Java дээр сүлжээний програм үүсгэх Step13

Алхам 13. Зурвас илгээх

Өгөгдлийг бүхэлд нь бичсэн эсэхийг шалгахын тулд гаралтын урсгал руу өгөгдөл бичиж, урсгалыг угаана уу.

  • Өгөгдлийн урсгал

    Мессежийн уртыг эхлээд илгээх шаардлагатай бөгөөд нөгөө тал нь хичнээн байт унших шаардлагатайг мэддэг. Уртыг энгийн бүхэл тоо болгон илгээсэний дараа байт илгээж болно.

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); байт messageOut = "Сайн уу ертөнц".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); }}

  • Объектын урсгал

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); String messageOut = "Сайн уу ертөнц"; clientOut.writeObject (messageOut); clientOut.flush (); }}

Java дээр сүлжээний програм үүсгэх Step14
Java дээр сүлжээний програм үүсгэх Step14

Алхам 14. Илгээсэн мессежийг бүртгэх

Бүртгэлийн зорилгоор мессеж илгээгдсэнийг консол дээр хэвлэ.

  • Өгөгдлийн урсгал

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); байт messageOut = "Сайн уу ертөнц".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + шинэ String (messageOut)); }}

  • Объектын урсгал

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); String messageOut = "Сайн уу ертөнц"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + messageOut); }}

Java дээр сүлжээний програм үүсгэх Step15
Java дээр сүлжээний програм үүсгэх Step15

Алхам 15. Зурвасыг уншина уу

Оруулсан урсгалаас өгөгдлийг уншиж хөрвүүлэх. Бид илгээсэн өгөгдлийн төрлийг яг таг мэддэг тул бид a үүсгэх болно

Мөр

-аас

байт

эсвэл жүжигчид

Обьект

руу

Мөр

ашиглаж байгаа урсгалаас хамааран шалгахгүйгээр.

  • Өгөгдлийн урсгал

    Уртыг эхлээд, дараа нь байтыг илгээсэн тул унших ажлыг ижил дарааллаар хийх ёстой. Хэрэв урт нь тэг бол унших зүйл байхгүй болно. Байтуудыг буцааж жишээ болгон хөрвүүлэх тохиолдолд объектыг цуцална

    Мөр

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); байт messageOut = "Сайн уу ертөнц".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + шинэ String (messageOut)); int урт = serverIn.readInt (); if (урт> 0) {байт messageIn = шинэ байт [урт]; serverIn.readFully (messageIn, 0, messageIn.length); }}}

  • Объектын урсгал

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); String messageOut = "Сайн уу ертөнц"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + messageOut); String messageIn = (String) serverIn.readObject (); }}

Java дээр сүлжээний програм үүсгэх Step16
Java дээр сүлжээний програм үүсгэх Step16

Алхам 16. Бичсэн мессеж

Бүртгэлийн зорилгоор мессеж хүлээн авсан консол дээр хэвлээд түүний агуулгыг хэвлэ.

  • Өгөгдлийн урсгал

    java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); DataOutputStream clientOut = шинэ DataOutputStream (client.getOutputStream ()); DataInputStream clientIn = шинэ DataInputStream (client.getInputStream ()); DataOutputStream serverOut = шинэ DataOutputStream (connection.getOutputStream ()); DataInputStream serverIn = шинэ DataInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); байт messageOut = "Сайн уу ертөнц".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + шинэ String (messageOut)); int урт = serverIn.readInt (); if (урт> 0) {байт messageIn = шинэ байт [урт]; serverIn.readFully (messageIn, 0, messageIn.length); System.out.println ("Үйлчлүүлэгчээс ирсэн мессеж:" + шинэ String (messageIn)); }}}

  • Объектын урсгал

    java.io. ObjectInputStream импортлох; java.io. ObjectOutputStream импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); ObjectOutputStream clientOut = шинэ ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = шинэ ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = шинэ ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = шинэ ObjectInputStream (connection.getInputStream ()); System.out.println ("Харилцаа холбоо бэлэн байна."); String messageOut = "Сайн уу ертөнц"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Сервер рүү илгээсэн мессеж:" + messageOut); String messageIn = (String) serverIn.readObject (); System.out.println ("Үйлчлүүлэгчээс ирсэн мессеж:" + messageIn); }}

Java дээр сүлжээний програм үүсгэх Step17
Java дээр сүлжээний програм үүсгэх Step17

Алхам 17. Холболтыг салга

Нэг тал дамжуулалтаа хааснаар холболт тасардаг. Java дээр гаралтын урсгалыг хааснаар холбогдох сокет ба оролтын урсгал хаагдах болно. Нөгөө талаас талууд холболт тасарсныг олж мэдээд санах ой алдагдахаас урьдчилан сэргийлэхийн тулд гаралтын урсгалыг хаах хэрэгтэй.

// java.net. InetAddress импортыг оруулаагүй болно; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); // кодыг орхигдуулсан System.out.println ("Харилцаа холбоо бэлэн байна."); // кодыг орхигдуулсан clientOut.close (); serverOut.close (); }}

Java дээр сүлжээний програм үүсгэх Step18 V2
Java дээр сүлжээний програм үүсгэх Step18 V2

Алхам 18. Бүртгэлийг таслах

Бүртгэлийн зорилгоор консол руу хэвлэх холболтыг салгасан байна.

// java.net. InetAddress импортыг оруулаагүй болно; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); // кодыг орхигдуулсан System.out.println ("Харилцаа холбоо бэлэн байна."); // кодыг орхигдуулсан clientOut.close (); serverOut.close (); System.out.println ("Холболтууд хаагдсан."); }}

Java Step19 дээр сүлжээний програм үүсгэх
Java Step19 дээр сүлжээний програм үүсгэх

Алхам 19. Серверийг цуцлах

Холболт тасарсан боловч сервер асаалттай хэвээр байна. Шиг

ServerSocket

нь ямар ч урсгалтай холбоогүй тул дуудлага хийх замаар үүнийг тодорхой хаах шаардлагатай

ойрхон ()

арга.

// java.net. InetAddress импортыг оруулаагүй болно; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); // кодыг орхигдуулсан System.out.println ("Харилцаа холбоо бэлэн байна."); // кодыг орхигдуулсан clientOut.close (); serverOut.close (); System.out.println ("Холболтууд хаагдсан."); server.close (); }}

Java дээр сүлжээний програм үүсгэх Step20
Java дээр сүлжээний програм үүсгэх Step20

Алхам 20. Лог серверийг цуцлах

Бүртгэлийн зорилгоор консол сервер рүү хэвлэх ажлыг зогсоосон.

// java.net. InetAddress импортыг оруулаагүй болно; java.net. ServerSocket импортлох; java.net. Socket импортлох; public class NetworkAppExample {public static void main (String args) шидэлтүүд Exception {String host = "localhost"; int порт = 10430; ServerSocket сервер = шинэ ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Серверийг эхлүүлсэн."); Сокет үйлчлүүлэгч = шинэ сокет (хост, порт); System.out.println ("Сервертэй холбогдож байна …"); Сокет холболт = server.accept (); System.out.println ("Холболт тогтоогдсон."); // кодыг орхигдуулсан System.out.println ("Харилцаа холбоо бэлэн байна."); // кодыг орхигдуулсан clientOut.close (); serverOut.close (); System.out.println ("Холболтууд хаагдсан."); server.close (); System.out.println ("Сервер дууссан."); }}

Java Step21 дээр сүлжээний програм үүсгэх
Java Step21 дээр сүлжээний програм үүсгэх

Алхам 21. Эмхэтгэж ажиллуулна уу

Бүртгэл нь програм амжилттай болсон эсэхийг олж мэдэх боломжийг бидэнд олгосон. Хүлээгдэж буй гаралт:

Сервер эхлэв. Сервертэй холбогдож байна … Холболт үүслээ. Харилцаа холбоо бэлэн байна. Сервер рүү илгээсэн мессеж: Сайн байна уу Дэлхийн үйлчлүүлэгчээс ирсэн мессеж: Hello World Connections хаалттай байна. Серверийг хаасан.

Хэрэв таны гаралт дээр дурдсантай адил биш бол магадлал багатай бол хэд хэдэн шийдэл байна.

  • Хэрэв гаралт шугам дээр зогсвол

    Холболт тогтоосон.

    болон объектын урсгалыг ашигладаг бөгөөд тус бүрийг угаана

    ObjectOutputStream

  • зарим шалтгаанаар толгой илгээгээгүй тул эхлүүлсний дараа.
  • Хэрэв гаралт хэвлэгдэх юм бол

    java.net. BindException: Хаяг аль хэдийн ашиглагдаж байна

  • заасан портыг аль хэдийн ашигласан тул өөр порт дугаар сонгоно уу.

Зөвлөмж

  • Өөр сүлжээнд байгаа сервертэй холбогдох нь дамжуулагдсан порт бүхий серверийг ажиллуулж буй төхөөрөмжийн гадаад IP хаяг руу холбогдох замаар хийгддэг.
  • Нэг сүлжээнд байгаа сервертэй холбогдох нь сервер ажиллуулж буй төхөөрөмжийн хувийн IP хаяг руу холбогдох эсвэл порт дамжуулах, төхөөрөмжийн гадаад IP хаяг руу холбогдох замаар хийгддэг.
  • Порт дамжуулахгүйгээр өөр сүлжээнд сервер рүү холбогдох боломжийг олгодог Hamachi гэх мэт програм хангамж байдаг боловч энэ програмыг хоёр төхөөрөмж дээр суулгахыг шаарддаг.

Жишээ

Блоклох оролт/гаралтыг ашигладаг сүлжээний програмууд урсгал ашиглах шаардлагатай. Дараах жишээнүүд нь урсгалтай минималист сервер ба үйлчлүүлэгчийн хэрэгжилтийг харуулж байна. Сүлжээний код нь үндсэн нийтлэлтэй адилхан бөгөөд зарим хэсгийг синхрончилж, урсгал руу шилжүүлж, үл хамаарах зүйлийг зохицуулдаг.

Server.java

java.io. IOException импортлох; java.net. InetAddress импортлох; java.net. ServerSocket импортлох; java.net. SocketException импортлох; java.net. UnknownHostException импортлох; java.util. ArrayList импортлох; java.util. Collections импортлох; java.util. List импортлох; /*** {@кодын сервер} анги нь сүлжээний серверийн төгсгөлийн цэгийг илэрхийлдэг. {@code Server} нь тодорхой IP * хаяг, порт руу холбогдсоны дараа үйлчлүүлэгчидтэй холбоо тогтоож, тэдэнтэй харилцах эсвэл салгах боломжтой болно. *

* Энэ анги нь аюулгүй юм. * * @version 1.0 * @Client харах * @see Connection */ public class Server нь Runnable {private ServerSocket server -ийг хэрэгжүүлдэг; хувийн жагсаалт холболтууд; хувийн урсгалтай утас; хувийн эцсийн Объектын холболтуудLock = new Object (); /** * Ирж буй үйлчлүүлэгчдийн дарааллын хамгийн дээд уртыг заасан хост нэр болон порт дээр үйлчлүүлэгчидтэй харилцдаг {@кодын сервер} байгуулна. * * @param хост Ашиглах хостын хаяг. * @param порт Ашиглах портын дугаар. * @param backlog Ирж буй үйлчлүүлэгчдийн дарааллын хамгийн их уртыг хүссэн. * @thows NetworkException Хэрэв сервер эхлүүлэх явцад алдаа гарвал. */ нийтийн сервер (String host, int port, int backlog) нь NetworkException хаядаг {try {server = new ServerSocket (port, backlog, InetAddress.getByName (host))); } catch (UnknownHostException e) {new NetworkException хаях ("Хостын нэрийг шийдэж чадсангүй:" + хост, e); } catch (IllegalArgumentException e) {new NetworkException хаях ("Порт дугаар нь 0-65535 (хамааруулсан) хооронд байх шаардлагатай:" + порт); } catch (IOException e) {new NetworkException хаях ("Серверийг эхлүүлж чадсангүй.", e); } холболтууд = Collections.synchronizedList (шинэ ArrayList ()); thread = шинэ Thread (энэ); thread.start (); } /*** Заасан хостын нэр болон порт дээр үйлчлүүлэгчидтэй харилцдаг {@кодын сервер} байгуулна. * * @param хост Холбогдох хост хаяг. * @param порт Холбох портын дугаар. * @Server хаягийг шиддэг Хэрэв сервер эхлүүлэх явцад алдаа гардаг. */ нийтийн сервер (String host, int port) нь NetworkException хаядаг {энэ (хост, порт, 50); } /*** Үйлчлүүлэгчдээс ирж буй холболтыг сонсож, хүлээн авч, бүртгэдэг. */ @Override public void run () {while (! Server.isClosed ()) {try {connections.add (new Connection (server.accept ()))); } барих (SocketException e) {if (! e.getMessage (). тэнцүү ("Socket хаалттай")) {e.printStackTrace (); }} барих (NetworkException | IOException e) {e.printStackTrace (); }}} /*** Бүртгэгдсэн бүх үйлчлүүлэгчдэд өгөгдөл илгээдэг. * * @param data Илгээх өгөгдөл. * @хууль бусStateException хаядаг Хэрэв сервер офлайн байх үед өгөгдөл бичихийг оролддог. * @IllegalArgumentException хаядаг Хэрэв илгээх өгөгдөл нь хоосон байвал. */ нийтийн хүчин төгөлдөр бус нэвтрүүлэг (Объектын өгөгдөл) {if (server.isClosed ()) {new IllegalStateException хаях ("Өгөгдөл илгээгээгүй, сервер офлайн байна."); } if (data == null) {new IllegalArgumentException хаях ("null data"); } synchronized (ConnectionsLock) {for (Холболтын холболт: холболтууд) {оролдох {connection.send (data); System.out.println ("Өгөгдлийг үйлчлүүлэгчид амжилттай илгээсэн."); } барих (NetworkException e) {e.printStackTrace (); }}}} /*** Таслах тухай мессеж илгээж, заасан үйлчлүүлэгчийг салгана. * * @param холболт Үйлчлүүлэгчийг салгах. * @thows NetworkException Хэрэв холболтыг хааж байхад алдаа гарвал. */ public void disconnect (Connection connection) нь NetworkException хаядаг {if (холболтуудыг устгах (холболт)) {connection.close (); }} /*** Бүх үйлчлүүлэгчдэд холболтыг таслах тухай мессеж илгээж, тэдгээрийг салгаж серверийг зогсооно. */ public void close () нь NetworkException {synchronized (ConnectionsLock) {for (Connection connection: connection) {try {connection.close (); } барих (NetworkException e) {e.printStackTrace (); }}} холболтууд.clear (); {server.close () оролдоно уу; } catch (IOException e) {new NetworkException хаях ("Серверийг хааж байхад гарсан алдаа."); } эцэст нь {thread.interrupt (); }} /*** Сервер онлайн байгаа эсэхийг буцаана. * * Хэрэв сервер онлайн байгаа бол @буцах Үнэн. Худлаа, тэгэхгүй бол. */ public boolean isOnline () {return! server.isClosed (); } /*** Бүртгэгдсэн үйлчлүүлэгчдийн массивыг буцаана. */ public Connection getConnections () {synchronized (connectionsLock) {буцах холбоосууд.toArray (шинэ Холболт [холболтууд.size ()])); }}}

Client.java

java.io. IOException импортлох; java.net. Socket импортлох; java.net. UnknownHostException импортлох; /*** {@code Client} анги нь сүлжээнд байгаа үйлчлүүлэгчийн төгсгөлийн цэгийг илэрхийлдэг. Тодорхой * серверт холбогдсон {@code Client} нь зөвхөн сервертэй харилцах боломжтой болно. Бусад үйлчлүүлэгчид өгөгдөл хүлээн авах эсэх * нь серверийн хэрэгжилтээс хамаарна. *

* Энэ анги нь аюулгүй юм. * * @version 1.0 * @Server харах * @Connection харах// public class Client {private Connection connection; /*** Заасан хост болон порт дээрх серверт холбогдсон {@кодын үйлчлүүлэгч} байгуулна. * * @param хост Холбогдох хостын хаяг. * @param порт Холбох портын дугаар. * @thows NetworkException Хэрэв сервер эхлүүлэх явцад алдаа гарвал. */ public Client (String host, int port) нь NetworkException хаядаг {try {connection = new Connection (new Socket (host, port)); } catch (UnknownHostException e) {new NetworkException хаях ("Хостын нэрийг шийдэж чадсангүй:" + хост, e); } catch (IllegalArgumentException e) {new NetworkException хаях ("Порт дугаар нь 0-65535 (хамааруулсан) хооронд байх шаардлагатай:" + порт); } catch (IOException e) {new NetworkException хаях ("Серверийг эхлүүлж чадсангүй.", e); }} /*** Өгөгдлийг нөгөө тал руу илгээдэг. * * @param data Илгээх өгөгдөл. * @thows NetworkException Хэрэв гаралтын урсгал руу бичих амжилтгүй болвол. * @IllegalStateException хаядаг Хэрэв холболт хаагдах үед өгөгдөл бичихийг оролддог. * @IllegalArgumentException хаядаг Хэрэв илгээх өгөгдөл нь хоосон байвал. * @supportedOperationException -ийг дэмждэггүй бол өгөгдлийн төрлийг илгээхийг оролддог. */ public void send (Object data) хаях нь NetworkException {connection.send (data); } /*** Сервер рүү холболтыг таслах тухай мессеж илгээж, холболтыг хаадаг. */ public void close () нь NetworkException {connection.close () хаядаг; } /*** Үйлчлүүлэгч сервертэй холбогдсон эсэхээс үл хамааран буцаана. * * Хэрэв үйлчлүүлэгч холбогдсон бол @буцах Үнэн. Худлаа, тэгэхгүй бол. */ public boolean isOnline () {return connection.isConnected (); } /*** Үйлчлүүлэгчийн {@link Connection} тохиолдлыг буцаана. */ public Connection getConnection () {буцах холболт; }}

Холболт.java

java.io. DataInputStream импортлох; java.io. DataOutputStream импортлох; java.io. IOException импортлох; java.net. Socket импортлох; java.net. SocketException импортлох; /** * Ангилал {@кодын холболт} нь серверээс клиент хүртэлх холболтыг эсвэл сүлжээний үйлчлүүлэгчийн төгсгөлийн цэгийг илэрхийлдэг * {@Code Connection} холбогдсоны дараа бусад тал эсвэл талуудтай мэдээлэл солилцох боломжтой болно. сервер дээр * хэрэгжилт. *

* Энэ анги нь аюулгүй юм. * * @version 1.0 * @серверийг үзэх * @үйлчлүүлэгчийг харах */ public class Connection нь Runnable {private Socket socket; хувийн DataOutputStream гарах; хувийн DataInputStream; хувийн урсгалтай утас; хувийн эцсийн Object writeLock = шинэ Объект (); хувийн эцсийн Объект readLock = шинэ Объект (); /*** Заасан {@link Socket} -н дамжуулалтыг ашиглан {@кодын холболт} -ыг бүтээдэг. * * @param сокет Сокет нь урсгалыг татаж авах боломжтой.*/ public Connection (Socket socket) нь NetworkException хаядаг {if (socket == null) {new IllegalArgumentException ("null socket") хаях); } this.socket = залгуур; {out = new DataOutputStream (socket.getOutputStream ()) -ийг туршиж үзээрэй; } catch (IOException e) {new NetworkException хаях ("Гаралтын урсгалд хандаж чадсангүй.", e); } оролдох {in = шинэ DataInputStream (socket.getInputStream ()); } catch (IOException e) {new NetworkException хаях ("Оролтын урсгалд хандаж чадсангүй.", e); } thread = шинэ Thread (энэ); thread.start (); } /*** Нөгөө талтай холбогдож байх үед мессежийг уншдаг. */ @Override public void run () {while (! Socket.isClosed ()) {try {int identifier; байт байт; синхрончлогдсон (readLock) {танигч = in.readInt (); int урт = in.readInt (); if (урт> 0) {байт = шинэ байт [урт]; in.readFully (байт, 0, байт. урт); } өөр {үргэлжлүүлэх; }} switch (танигч) {case Identifier. INTERNAL: String тушаал = шинэ String (байт); if (command.equals ("disconnect")) {if (! socket.isClosed ()) {System.out.println ("Салгах пакет хүлээн авсан."); оролдох {close (); } барих (NetworkException e) {буцах; }}} завсарлага; case Identifier. TEXT: System.out.println ("Зурвас хүлээн авсан:" + шинэ мөр (байт)); завсарлага; анхдагч: System.out.println ("Танигдаагүй өгөгдлийг хүлээн авсан."); }} барих (SocketException e) {if (! e.getMessage (). тэнцүү ("Socket хаалттай")) {e.printStackTrace (); }} барих (IOException e) {e.printStackTrace (); }}} /*** Өгөгдлийг нөгөө тал руу илгээдэг. * * @param data Илгээх өгөгдөл. * @thows NetworkException Хэрэв гаралтын урсгал руу бичих амжилтгүй болвол. * @IllegalStateException хаядаг Хэрэв холболт хаагдах үед өгөгдөл бичихийг оролддог. * @IllegalArgumentException хаядаг Хэрэв илгээх өгөгдөл нь хоосон байвал. * @supportedOperationException -ийг дэмждэггүй бол өгөгдлийн төрлийг илгээхийг оролддог. */ public void send (Object data) нь NetworkException хаядаг {if (socket.isClosed ()) {new IllegalStateException хаяна ("Өгөгдөл илгээгээгүй, холболт хаагдсан байна"); } if (data == null) {new IllegalArgumentException хаях ("null data"); } int таних тэмдэг; байт байт; if (өгөгдлийн жишээний мөр) {identifier = Identifier. TEXT; байт = ((String) өгөгдөл).getBytes (); } өөр {шидэх шинэ UnsupportedOperationException ("Дэмжигдээгүй өгөгдлийн төрөл:" + data.getClass ()); } оролдох {synchronized (writeLock) {out.writeInt (таних тэмдэг); out.writeInt (байтын урт); out.write (байт); out.flush (); }} catch (IOException e) {new NetworkException хаях ("Өгөгдлийг илгээж чадсангүй.", e); }} /*** Нөгөө тал руугаа холбоо таслах тухай мессеж илгээж, холболтыг хаадаг. */ public void close () хаягаар NetworkException {if (socket.isClosed ()) {new IllegalStateException хаяна ("Холболт аль хэдийн хаагдсан байна."); } оролдох {байт message = "салгах".getBytes (); синхрончлогдсон (writeLock) {out.writeInt (Identifier. INTERNAL); out.writeInt (message.length); out.write (зурвас); out.flush (); }} catch (IOException e) {System.out.println ("Холболтыг таслах мессежийг илгээж чадсангүй."); } оролдох {synchronized (writeLock) {out.close (); }} catch (IOException e) {new NetworkException хаях ("Холболтыг хааж байхад алдаа гарлаа.", e); } эцэст нь {thread.interrupt (); }} /*** Нөгөө талтай холболт амьд байгаа эсэхийг буцаана. * * Хэрэв холболт амьд байвал @буцах нь үнэн болно. Худлаа, тэгэхгүй бол. */ public boolean isConnected () {return! socket.isClosed (); }}

Тодорхойлогч.java

/** * {@Code Identifier} анги нь сүлжээгээр илгээгдсэн өгөгдлийг цуврал болгох, цуцлахад {@link Connection} ашигладаг тогтмолуудыг агуулдаг. * * @version 1.0 * @See Connection * / public final class Identifier { / ** * Дотоод мессежийг таниулагч. */ public static final int INTERNAL = 1; /*** Текст мессежийг таних тэмдэг. */ public static final int TEXT = 2; }

NetworkException.java

/*** {@code NetworkException} анги нь сүлжээтэй холбоотой алдааг илтгэнэ. * / public class NetworkException нь Exception -ийг өргөтгөдөг { / *** {@code null} гэсэн мессеж болгон {@code NetworkException} бүтээдэг. * / public NetworkException () {} / *** Заасан мессежээр {@code NetworkException} бүтээдэг. * * @param message Алдааг тайлбарлах мессеж. */ public NetworkException (String message) {супер (зурвас); } /*** Заасан мессеж болон шалтгааныг агуулсан {@code NetworkException} бүтээдэг. * * @param message Алдааг тайлбарлах мессеж. * @param шалтгаан Алдааны шалтгаан. */ public NetworkException (String message, Throwable шалтгаан) {супер (зурвас, шалтгаан); } /*** Заасан шалтгааны улмаас {@code NetworkException} бүтээдэг. * * @param шалтгаан Алдааны шалтгаан. */ public NetworkException (Throwable шалтгаан) {супер (шалтгаан); }}

Хэрэглээний жишээ.java

/*** {@cod UsageExample} анги нь {@link Server} болон {@link Client} -н хэрэглээг харуулдаг. Энэ жишээн дээр * {@link Thread#sleep (long)} - ийг ашиглан сегмент бүрийг гүйцэтгэхийг баталгаажуулдаг, учир нь хурдан эхлүүлэх, хаах нь зарим * сегментийг ажиллуулахгүй болгодог. * * @version 1.0 * @серверийг үзэх * @үйлчлүүлэгчийг харах */ нийтийн анги UsageExample {public static void main (String args) онцгой тохиолдлуудыг шиддэг {String host = "localhost"; int порт = 10430; Сервер сервер = шинэ сервер (хост, порт); Үйлчлүүлэгч үйлчлүүлэгч = шинэ үйлчлүүлэгч (хост, порт); Thread.sleep (100L); client.send ("Сайн уу."); server.broadcast ("Хөөе, нөхөр!"); Thread.sleep (100L); server.disconnect (server.getConnections () [0]); // эсвэл client.close () клиент талын серверээс салгахын тулд.close (); }}

Зөвлөмж болгож буй: