Javaда тармактык тиркемени кантип түзүү керек (сүрөттөр менен)

Мазмуну:

Javaда тармактык тиркемени кантип түзүү керек (сүрөттөр менен)
Javaда тармактык тиркемени кантип түзүү керек (сүрөттөр менен)

Video: Javaда тармактык тиркемени кантип түзүү керек (сүрөттөр менен)

Video: Javaда тармактык тиркемени кантип түзүү керек (сүрөттөр менен)
Video: ПАРОЛНИ ОЧИШ ХАММА КУРСИН 2024, Апрель
Anonim

Белгилүү бир түзмөктө аткарылган кодду жазуу абдан канааттандырарлык. Бирок, бири-бири менен байланышкан бир нече түзмөктө иштеген кодду жазуу жөн гана жашоону тастыктайт. Бул макала сизге кантип туташууну жана билдирүүлөрдү алмашууну башкаруу протоколун (TCP) колдонуу аркылуу үйрөтөт.

Бул макалада, сиз өзүңүзгө компьютериңизди туташтыра турган, негизинен, аны жинди кылуучу тиркемени орнотосуз. Сиз ошондой эле Javaда тармакташуу үчүн эң көп колдонулган эки агымдын ортосундагы айырманы жана алардын иштешин үйрөнөсүз.

Маалыматтар жана объект агымдары

Кодго түшүүдөн мурун, макалада колдонулган эки агымдын ортосундагы айырманы айырмалоо керек.

Маалымат агымдары

Маалымат агымдары алгачкы маалымат түрлөрүн жана саптарын иштетет. Маалымат агымдары аркылуу жөнөтүлгөн маалыматтарды кол менен сериялаштыруу керек жана татаал маалыматтарды берүүнү кыйындатат. Бирок, маалымат агымы Javaдан башка тилдерде жазылган серверлер жана кардарлар менен баарлаша алат. Чийки агымдар бул жагынан маалымат агымдарына окшош, бирок маалымат агымдары маалыматтын платформага көз карандысыз түрдө форматталуусун камсыз кылат, бул пайдалуу, анткени эки тарап тең жөнөтүлгөн маалыматтарды окуй алышат.

Объект агымдары

Объект агымдары алгачкы маалымат түрлөрүн жана ишке ашыруучу объекттерди иштетет

Serializable

интерфейс. Объект агымдары аркылуу жөнөтүлгөн маалыматтар автоматтык түрдө сериалдаштырылат жана татаал маалыматтарды берүүнү жеңилдетет. Бирок, объект агымдары Javaда жазылган серверлер жана кардарлар менен гана байланыша алат. Ошондой эле,

ObjectOutputStream

инициализациядан кийин, ге баш ат жөнөтөт

InputStream

башталгандан кийин, аталыш алынганга чейин аткарууну бөгөгөн экинчи тараптын.

Кадамдар

Java Step1де Тармак Колдонмосун түзүңүз
Java Step1де Тармак Колдонмосун түзүңүз

Кадам 1. Класс түзүү

Класс түзүңүз жана каалаганыңызча ат коюңуз. Бул макалада ал аталат

NetworkAppExample

коомдук класс NetworkAppExample {}

Java Step2 тармагына тиркеме түзүңүз
Java Step2 тармагына тиркеме түзүңүз

Кадам 2. Негизги ыкманы түзүү

Негизги ыкманы түзүңүз жана ал өзгөчө учурларды жаратышы мүмкүн деп жарыялаңыз

Exception

түрү жана анын каалаган классчасы - бардык өзгөчөлүктөр. Бул жаман практика деп эсептелет, бирок сөөктүү мисалдар үчүн алгылыктуу.

коомдук класс NetworkAppExample {public static void main (String args) ыргытуу Өзгөчөлүгү {}}

Java Step3 тармагына тиркеме түзүңүз
Java Step3 тармагына тиркеме түзүңүз

Кадам 3. Сервердин дарегин жарыялоо

Бул мисал жергиликтүү хосттун дарегин жана ыктыярдуу порт номерин колдонот. Порт номери 0 ден 65535ке чейин болушу керек. Бирок, порттун номерлери 0дөн 1023кө чейин (кошо алганда) качуу үчүн, анткени алар тутумдук порттор болуп саналат.

коомдук класс 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ти импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); }}

Java Step5 тармагына тиркеме түзүңүз
Java Step5 тармагына тиркеме түзүңүз

Кадам 5. Журнал серверинин башталышы

Журналга кирүү үчүн, сервер башталганын консолго басып чыгарыңыз.

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

Java Step6 тармагына тиркеме түзүңүз
Java Step6 тармагына тиркеме түзүңүз

Кадам 6. Кардар түзүү

Кардар сервердин дарегине жана портуна байланышкан жана туташуу түзүлгөндөн кийин пакеттерди (билдирүүлөрдү) угат. Java тилинде,

Розетка

серверге туташкан кардардык чекитти же кардарга байланышты (серверден) билдирет жана экинчи четиндеги тарап менен байланышуу үчүн колдонулат.

java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); }}

Java Step7де Тармак тиркемесин түзүңүз
Java Step7де Тармак тиркемесин түзүңүз

Кадам 7. Журналга туташуу аракети

Журналга кирүү үчүн, туташуу аракети болгонун консолго басып чыгарыңыз.

java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); System.out.println ("Серверге туташууда…"); }}

Java Step8де Тармак Колдонмосун түзүңүз
Java Step8де Тармак Колдонмосун түзүңүз

8 -кадам. Байланыш түзүү

Клиенттер эч качан туташпайт, эгер сервер угуп, кабыл албаса, башкача айтканда, байланыштарды түзбөсө. Javaда туташуулар колдонулуп орнотулат

кабыл алуу ()

ыкмасы

ServerSocket

класс. Бул ыкма кардар туташмайынча аткарууну бөгөттөйт.

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

Java Step9де тармактык тиркеме түзүңүз
Java Step9де тармактык тиркеме түзүңүз

Кадам 9. Катталган байланышты каттоо

Журналга кирүү үчүн, консолго сервер менен кардардын ортосундагы байланыш орнотулганын басып чыгарыңыз.

java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World".getBytes (); }}

  • Объект агымдары

    java.io. ObjectInputStream импорттоо; java.io. ObjectOutputStream импорттоо; java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World"; }}

Java Step13 тармагына тиркеме түзүңүз
Java Step13 тармагына тиркеме түзүңүз

Кадам 13. Билдирүүнү жөнөтүү

Чыгуу агымына маалыматтарды жазыңыз жана маалымат толугу менен жазылганын камсыз кылуу үчүн агымды тазалаңыз.

  • Маалымат агымы

    Билдирүүнүн узундугу биринчи жөнөтүлүшү керек, ошондуктан экинчи тарап канча байт окуу керектигин билет. Узундук бүтүн сан катары жөнөтүлгөндөн кийин, байттарды жөнөтүүгө болот.

    java.io. DataInputStream импорттоо; java.io. DataOutputStream импорттоо; java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World".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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World"; 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World".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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Билдирүү серверге жөнөтүлдү:" + messageOut); }}

Java Step15 тармагына тиркеме түзүңүз
Java Step15 тармагына тиркеме түзүңүз

Кадам 15. Билдирүүнү окуңуз

Киргизүү агымындагы маалыматтарды окуп, аны айлантыңыз. Биз жөнөтүлгөн маалыматтын түрүн так билгендиктен, же

Стринг

тартып

байт

же гипс

Объект

чейин

Стринг

текшерилбестен, колдонулган агымга жараша.

  • Маалымат агымы

    Узундук биринчи жана байт жөнөтүлгөндүктөн, окуу ошол эле тартипте жасалышы керек. Узундугу нөлгө барабар болсо, окууга эч нерсе жок. Байттар кайра инстанцияга айландырылганда, объект дезериализацияланат

    Стринг

    java.io. DataInputStream импорттоо; java.io. DataOutputStream импорттоо; java.net. InetAddress импорттоо; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Билдирүү серверге жөнөтүлдү:" + жаңы String (messageOut)); int length = 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World"; 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Билдирүү серверге жөнөтүлдү:" + жаңы String (messageOut)); int length = 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 = "Hello World"; 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); System.out.println ("Серверге туташууда…"); Сокет байланышы = server.accept (); System.out.println ("Байланыш орнотулду."); // код алынып салынган System.out.println ("Байланыш даяр."); // код алынып салынган clientOut.close (); serverOut.close (); System.out.println ("Байланыштар жабык."); }}

Java Step19де Тармак Колдонмосун түзүңүз
Java Step19де Тармак Колдонмосун түзүңүз

Кадам 19. Серверди токтотуу

Байланыштар үзүлгөн, бирок сервер дагы эле иштеп жатат. As

ServerSocket

эч кандай агым менен байланышкан эмес, аны чалуу менен жабуу керек

жабуу ()

ыкма.

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

Java Step20де тармактык тиркеме түзүңүз
Java Step20де тармактык тиркеме түзүңүз

Кадам 20. Журнал серверинин токтотулушу

Журналга кирүү үчүн консол серверине басып чыгаруу токтотулду.

// импорт java.net. InetAddress киргизилген жок; java.net. ServerSocketти импорттоо; java.net. Socket импорттоо; коомдук класс NetworkAppExample {public static void main (String args) ыргытат Exception {String host = "localhost"; int порт = 10430; ServerSocket Server = жаңы ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println ("Сервер башталды."); Socket client = new Socket (host, port); 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 Кардардан алынган билдирүү: 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} классы тармактагы сервердин акыркы чекитин билдирет. {@code Server} бир жолу белгилүү бир IP * дарегине жана портуна байланган, кардарлар менен байланыш түзүп, алар менен баарлашууга же ажыратууга жөндөмдүү. *

* Бул класс жиптерге коопсуз. * * @version 1.0 * @see Client * @see Connection */ public class Server Runnable {private ServerSocket серверин ишке ашырат; жеке тизме байланыштар; жеке Thread жип; жеке акыркы Объект байланыштарыLock = new Object (); /** * Кирүүчү кардарлардын кезегинин белгиленген * талап кылынган максималдуу узундугу менен көрсөтүлгөн хосттун аталышы жана порт боюнча кардарлар менен иштешүүчү {@code Server} курат. * * @param host Hostтун дарегин колдонуу. * @param порт Колдонуу үчүн порт номери. * @param backlog Кирүүчү кардарлардын кезегинин максималдуу узундугу суралды. * @throws NetworkException Серверди иштетүүдө ката кетсе. */ public Server (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.start (); } /*** Көрсөтүлгөн хосттун аты жана порт боюнча кардарлар менен иштешкен {@code Server} курат. * * @param host Hostтун дареги байланат. * @param порт Байланыш үчүн порт номери. * @throws NetworkException Серверди иштетүүдө каталар кетсе. */ public Server (String host, int port) NetworkException ыргытат {this (host, port, 50); } /*** Кардарлардан келген байланыштарды угат, кабыл алат жана каттайт. */ @Override public void run () {while (! Server.isClosed ()) {try {Connections.add (new Connection (server.accept ()))); } кармоо (SocketException e) {if (! e.getMessage (). барабар ("Socket жабык")) {e.printStackTrace (); }} catch (NetworkException | IOException e) {e.printStackTrace (); }}} /*** Бардык катталган кардарларга маалыматтарды жөнөтөт. * * @param data Жөнөтүлө турган маалыматтар. * @throws IllegalStateException Эгерде сервер оффлайнда маалыматтарды жазууга аракет кылынса. * @throws IllegalArgumentException Эгерде жөнөтүлө турган маалыматтар нөл болсо. */ public void yayım (Object data) {if (server.isClosed ()) {new IllegalStateException ыргытуу ("Маалымат жөнөтүлгөн жок, сервер оффлайнда."); } if (data == null) {ыргытуу жаңы IllegalArgumentException ("нөлдүк маалымат"); } synchronized (ConnectionsLock) {for (Connection connection: Connections) {try {connection.send (data); System.out.println ("Берилиштер кардарга ийгиликтүү жөнөтүлдү."); } catch (NetworkException e) {e.printStackTrace (); }}}} /*** Ажыратуу кабарын жөнөтөт жана көрсөтүлгөн кардарды ажыратат. * * @param байланышы Кардар ажыратуу үчүн. * @throws NetworkException Байланышты жабууда ката кетсе. */ public void disconnect (Connection connection) NetworkException ыргытат {if (Connections.remove (connection)) {connection.close (); }} /*** Бардык кардарларга ажыратуу билдирүүсүн жөнөтөт, аларды ажыратат жана серверди токтотот. */ public void close () NetworkException {synchronized (ConnectionsLock) {for (Connection connection: Connections) {try {connection.close (); } catch (NetworkException e) {e.printStackTrace (); }}} Connections.clear (); аракет {server.close (); } catch (IOException e) {new NetworkException ыргытуу ("Серверди жабууда ката."); } акыры {thread.interrupt (); }} /*** Сервер онлайн же жок экенин кайтарат. * * @return True эгер сервер онлайнда болсо. Жалган, болбосо. */ public логикалык isOnline () {return! server.isClosed (); } /*** Катталган кардарлардын массивин кайтарат. */ public Connection getConnections () {synchronized (ConnectionsLock) {return links.toArray (new Connection [Connections.size ()])); }}}

Client.java

java.io. IOException импорттоо; java.net. Socket импорттоо; java.net. UnknownHostException импорттоо; /*** Класс {@code Client} тармактагы кардардын акыркы чекитин билдирет. {@code Client}, белгилүү бир * серверге туташкандан кийин, сервер менен гана байланышууга кепилдик берилет. Башка кардарлардын маалымат алаары же албашы сервердин ишке ашышына жараша болот. *

* Бул класс жиптерге коопсуз. * * @version 1.0 * @see Server * @see Connection */ public class Client {private Connection connection; /*** Көрсөтүлгөн хост жана порт боюнча серверге туташкан {@code Client} курат. * * @param host Hostтун дареги байланат. * @param порт Байланыш үчүн порт номери. * @throws 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 Жөнөтүлө турган маалыматтар. * @throws NetworkException Чыгуу агымына жазуу ишке ашпай калса. * @throws IllegalStateException Байланыш жабылганда маалыматтарды жазууга аракет кылынса. * @throws IllegalArgumentException Эгерде жөнөтүлө турган маалыматтар нөл болсо. * @throws UnsupportedOperationException Эгерде колдоого алынбаган маалымат түрүн жөнөтүүгө аракет кылынса. */ public void send (Object data) ыргытат NetworkException {connection.send (data); } /*** Ажыратуу билдирүүсүн серверге жөнөтөт жана байланышты жабат. */ public void close () NetworkException {connection.close () ыргытат; } /*** Кардар серверге туташканбы же жокпу, кайтарып берет. * * Кардар туташкан болсо, @return True. Жалган, болбосо. */ public логикалык isOnline () {return connection.isConnected (); } /*** Кардардын {@link Connection} нускасын кайтарат. */ public Connection getConnection () {кайра байланыш; }}

Connection.java

java.io. DataInputStream импорттоо; java.io. DataOutputStream импорттоо; java.io. IOException импорттоо; java.net. Socket импорттоо; java.net. SocketException импорттоо; /** * {@code Connection} классы серверден кардарга болгон байланышты же тармактын кардарынын акыркы чекитин билдирет * {@code Connection}, туташкандан кийин башка тараптар же тараптар менен маалымат алмашууга жөндөмдүү серверде * ишке ашыруу боюнча. *

* Бул класс жиптерге коопсуз. * * @version 1.0 * @see Server * @see Client */ public class Connection Runnable {private Socket socket; жеке DataOutputStream чыгып; жеке DataInputStream; жеке Thread жип; жеке акыркы Object writeLock = new Object (); жеке акыркы Объект readLock = жаңы Объект (); /*** Белгиленген {@link Socket} агымдарын колдонуу менен {@code Connection} курат. * * @param сокет Агымдарды алуу үчүн розетка.*/ public Connection (Socket socket) NetworkException ыргытат {if (socket == null) {new IllegalArgumentException ("null socket"); } this.socket = socket; {out = new DataOutputStream (socket.getOutputStream ()) аракет кылыңыз; } catch (IOException e) {new NetworkException ыргытуу ("Чыгуу агымына кире алган жок.", e); } аракет {in = жаңы DataInputStream (socket.getInputStream ()); } catch (IOException e) {new NetworkException ыргытуу ("Киргизүү агымына кире алган жок.", e); } thread = new Thread (бул); thread.start (); } /*** Башка тарап менен байланыш тирүү турганда билдирүүлөрдү окуйт. */ @Override public void run () {while (! Socket.isClosed ()) {try {int аныктагычы; байт байт; синхрондуу (readLock) {идентификатор = in.readInt (); int length = in.readInt (); if (узундугу> 0) {байт = жаңы байт [узундугу]; in.readFully (байт, 0, байт.лонг); } башка {улантуу; }} switch (идентификатор) {case Identifier. INTERNAL: String command = new String (байт); if (command.equals ("ажыратуу"))) {if (! socket.isClosed ()) {System.out.println ("Ажыратуу пакети алынды."); аракет {жабуу (); } catch (NetworkException e) {return; }}} тыныгуу; case Identifier. TEXT: System.out.println ("Билдирүү алынды:" + жаңы Стринг (байт)); тыныгуу; демейки: System.out.println ("Таанылбаган маалыматтар алынды."); }} кармоо (SocketException e) {if (! e.getMessage (). барабар ("Socket жабык")) {e.printStackTrace (); }} catch (IOException e) {e.printStackTrace (); }}} /*** Берилиштерди экинчи тарапка жөнөтөт. * * @param data Жөнөтүлө турган маалыматтар. * @throws NetworkException Чыгуу агымына жазуу ишке ашпай калса. * @throws IllegalStateException Байланыш жабылганда маалыматтарды жазууга аракет кылынса. * @throws IllegalArgumentException Эгерде жөнөтүлө турган маалыматтар нөл болсо. * @throws UnsupportedOperationException Эгерде колдоого алынбаган маалымат түрүн жөнөтүүгө аракет кылынса. */ public void send (Object data) NetworkException ыргытат {if (socket.isClosed ()) {ыргытуу жаңы IllegalStateException ("Маалымат жөнөтүлгөн жок, туташуу жабык."); } if (data == null) {ыргытуу жаңы IllegalArgumentException ("нөлдүк маалымат"); } int аныктагыч; байт байт; if (data instanceof of String) {идентификатор = Identifier. TEXT; байт = ((Стринг) маалыматтар).getBytes (); } else {ыргытуу жаңы UnsupportedOperationException ("Колдоого алынбаган маалыматтын түрү:" + data.getClass ()); } аракет {synchronized (writeLock) {out.writeInt (идентификатор); out.writeInt (bytes.length); out.write (байт); out.flush (); }} catch (IOException e) {new NetworkException ыргытуу ("Маалымат жөнөтүлбөй койду.", e); }} /*** Башка тарапка ажыратуу билдирүүсүн жөнөтөт жана байланышты жабат. */ public void close () NetworkException {if (socket.isClosed ()) {ыргытуу жаңы IllegalStateException ("Байланыш мурунтан эле жабык.") ыргытат; } аракет {байт message = "ажыратуу".getBytes (); синхрондуу (writeLock) {out.writeInt (Identifier. INTERNAL); out.writeInt (message.length); чыгуу.жазуу (билдирүү); out.flush (); }} catch (IOException e) {System.out.println ("Ажыратуу билдирүүсү жөнөтүлгөн жок."); } аракет {synchronized (writeLock) {out.close (); }} catch (IOException e) {new NetworkException ыргытуу ("Байланышты жабууда ката.", e); } акыры {thread.interrupt (); }} /*** Экинчи тарап менен байланыш тирүү же жок экенин кайтарат. * * @return True эгер байланыш тирүү болсо. Жалган, болбосо. */ public boolean isConnected () {return! socket.isClosed (); }}

Identifier.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} классы тармакка байланыштуу катаны көрсөтөт. * / коомдук класс 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 cause) {супер (билдирүү, себеп); } /*** Көрсөтүлгөн себеп менен {@code NetworkException} курат. * * @param себеп Катанын себеби. */ public NetworkException (Throwable cause) {супер (себеп); }}

UseExample.java

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

Сунушталууда: