Java -де желілік қосымшаны қалай құруға болады (суреттермен)

Мазмұны:

Java -де желілік қосымшаны қалай құруға болады (суреттермен)
Java -де желілік қосымшаны қалай құруға болады (суреттермен)

Бейне: Java -де желілік қосымшаны қалай құруға болады (суреттермен)

Бейне: Java -де желілік қосымшаны қалай құруға болады (суреттермен)
Бейне: Как включить 4G (LTE) на телефоне Android? 2024, Сәуір
Anonim

Белгілі бір құрылғыда орындалатын кодты жазу өте қанағаттанарлық. Бірақ бір-бірімен байланысатын бірнеше құрылғыларда орындалатын кодты жазу өмірді растайды. Бұл мақала таратуды басқару протоколы (TCP) көмегімен желі арқылы хабарларды қалай қосуға және алмасуға үйретеді.

Бұл мақалада сіз компьютерді өзіне қосатын және оны ақылға сыйдыратын - өзімен сөйлесетін қосымшаны орнатасыз. Сондай -ақ, сіз Java желісінде кеңінен қолданылатын екі ағынның арасындағы айырмашылықты және олардың қалай жұмыс істейтінін білесіз.

Деректер мен объектілік ағындар

Кодқа енер алдында мақалада қолданылатын екі ағынның айырмашылығын ажырату қажет.

Деректер ағындары

Ақпараттық ағындар бастапқы типтер мен жолдарды өңдейді. Деректер ағыны арқылы жіберілетін деректерді қолмен сериялау және десериализациялау қажет, бұл күрделі деректерді беруді қиындатады. Деректер ағыны Java тілінен басқа тілде жазылған серверлермен және клиенттермен байланыса алады. Шикі ағындар бұл жағынан деректер ағындарына ұқсас, бірақ деректер ағындары деректерді платформаға тәуелсіз түрде пішімдеуді қамтамасыз етеді, бұл пайдалы, себебі екі жақ жіберілген деректерді оқи алады.

Объектілік ағындар

Нысан ағындары бастапқы деректер түрлері мен іске асыратын объектілерді өңдейді

Серияланатын

интерфейс. Нысан ағындары арқылы жіберілетін деректер автоматты түрде сериализацияланады және сериализацияланады, бұл күрделі деректерді беруді жеңілдетеді. Бірақ, объектілік ағындар тек Java тілінде жазылған серверлермен және клиенттермен байланыса алады. Сондай -ақ,

ObjectOutputStream

инициализациядан кейін тақырыпты тақырыпқа жібереді

InputStream

инициализация кезінде тақырып алынбайынша орындалуды блоктайтын екінші тарап.

Қадамдар

Java Step1 желілік қосымшасын жасаңыз
Java Step1 желілік қосымшасын жасаңыз

Қадам 1. Сынып жасаңыз

Сынып жасаңыз және оны қалағаныңызша атаңыз. Бұл мақалада оның аты аталады

NetworkAppExample

қоғамдық сынып NetworkAppExample {}

Java Step2 желілік қосымшасын жасаңыз
Java Step2 желілік қосымшасын жасаңыз

Қадам 2. Негізгі әдісті жасаңыз

Негізгі әдісті жасаңыз және ол ерекше жағдайларды шығаруы мүмкін екенін мәлімдеңіз

Ерекшелік

түрі және оның кез келген қосалқы класы - барлық ерекшеліктер. Бұл жаман тәжірибе болып саналады, бірақ жалаңаш мысалдар үшін қолайлы.

қоғамдық сынып 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) ерекше жағдайларды шығарады {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) ерекше жағдайларды шығарады {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) ерекше жағдайларды шығарады {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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); }}

Java Step7 желілік қосымшасын жасаңыз
Java Step7 желілік қосымшасын жасаңыз

Қадам 7. Журналға қосылу әрекеті

Журналға кіру үшін консольге қосылым жасалғанын басып шығарыңыз.

java.net. InetAddress импорттау; java.net. ServerSocket импорттау; java.net. Socket импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) ерекше жағдайларды шығарады {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 («Хабар серверге жіберілді:» + жаңа жол (messageOut)); }}

  • Объектілер ағындары

    java.io. ObjectInputStream импорттау; java.io. ObjectOutputStream импорттау; java.net. InetAddress импорттау; java.net. ServerSocket импорттау; java.net. Socket импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 («Хабар серверге жіберілді:» + жаңа жол (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) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 («Хабар серверге жіберілді:» + жаңа жол (messageOut)); int length = serverIn.readInt (); if (ұзындық> 0) {байт messageIn = жаңа байт [ұзындық]; serverIn.readFully (messageIn, 0, messageIn.length); System.out.println («Клиенттен хабар алынды:» + жаңа жол (messageIn)); }}}

  • Объектілер ағындары

    java.io. ObjectInputStream импорттау; java.io. ObjectOutputStream импорттау; java.net. InetAddress импорттау; java.net. ServerSocket импорттау; java.net. Socket импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 импорттау; қоғамдық сынып NetworkAppExample {public static void main (String args) Ерекшеліктер {String host = «localhost»; int порт = 10430; ServerSocket сервері = жаңа ServerSocket (порт, 50, InetAddress.getByName (хост)); System.out.println («Сервер басталды.»); Socket client = жаңа Socket (хост, порт); 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 серверін іске асырады; жеке тізім байланыстар; жеке жіп; жеке соңғы Объект қосылымдарыLock = new Object (); /** * Келген клиенттер кезегінің белгіленген * сұралған максималды ұзындығымен көрсетілген хост атауында және портта клиенттермен әрекеттесетін {@code Server} құрады. * * @param хост қолданатын хост адресі. * @param порт Пайдаланылатын порт нөмірі. * @param backlog Келген клиенттер кезегінің максималды ұзақтығы сұралды. * @throws NetworkException Серверді іске қосу кезінде қате пайда болса. */ public Server (String host, int port, int backlog) NetworkException жібереді {try {server = new ServerSocket (порт, артта қалу, InetAddress.getByName (хост))); } catch (UnknownHostException e) {new NetworkException тастаңыз («Хост атауы шешілмеді:» + хост, e); } catch (IllegalArgumentException e) {new NetworkException тастау («Порт нөмірі 0 мен 65535 аралығында болуы керек (қоса):» + порт); } catch (IOException e) {new NetworkException тастаңыз («Серверді іске қосу мүмкін болмады.», e); } қосылымдар = Collections.synchronizedList (жаңа ArrayList ()); thread = new Thread (бұл); thread.start (); } /*** Көрсетілген хост атауы мен порты бойынша клиенттермен әрекеттесетін {@code Server} құрады. * * @param хост байланыстыратын хост адресі. * @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 ()))); } catch (SocketException e) {if (! e.getMessage (). equals («Socket Close»)) {e.printStackTrace (); }} catch (NetworkException | IOException e) {e.printStackTrace (); }}} /*** Деректерді барлық тіркелген клиенттерге жібереді. * * @param data Жіберілетін деректер. * @throws IllegalStateException Егер сервер желіден тыс кезде деректерді жазуға әрекет жасалса. * @throws IllegalArgumentException Егер жіберілетін деректер бос болса. */ public void yayınі (Object data) {if (server.isClosed ()) {new IllegalStateException («Деректер жіберілмеген, сервер офлайн.»); } if (data == null) {new IllegalArgumentException («бос деректер»); } синхронды (ConnectionsLock) {for (Connection connection: қосылымдар) {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: қосылымдар) {көріңіз {connection.close (); } catch (NetworkException e) {e.printStackTrace (); }}} қосылымдар.арқын (); {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 қосылымы; /*** Көрсетілген хост пен портта серверге қосылған {@code Client} құрастырады. * * @param хост байланыстыратын хост адресі. * @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 () {кері байланыс; }}

Қосылу.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; жеке жіп; private final Object writeLock = new Object (); private final Object readLock = new Object (); /*** Белгіленген {@link Socket} ағындарын пайдаланып {@code Connection} құрастырады. * * @param socket ағындарды алу үшін розетка.*/ 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.start (); } /*** Басқа тараппен байланыс тірі кезде хабарларды оқиды. */ @Override public void run () {while (! Socket.isClosed ()) {try {int идентификаторы; байт байт; синхрондалған (readLock) {идентификатор = in.readInt (); int ұзындығы = in.readInt (); if (ұзындық> 0) {байт = жаңа байт [ұзындық]; in.readFully (байт, 0, байт.ұзындығы); } басқа {жалғастыру; }} switch (идентификатор) {case Identifier. INTERNAL: String командасы = жаңа жол (байт); if (command.equals («ажырату»)) {if (! socket.isClosed ()) {System.out.println («Ажырату пакеті алынды.»); {close () көріңіз; } catch (NetworkException e) {қайтару; }}} үзіліс; case Identifier. TEXT: System.out.println («Хабар алынды:» + жаңа жол (байт)); үзіліс; әдепкі: System.out.println («Танылмаған деректер алынды.»); }} catch (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 ()) {throw new IllegalStateException («Деректер жіберілмеген, байланыс жабылған.»); } if (data == null) {new IllegalArgumentException («бос деректер»); } int идентификаторы; байт байт; if (деректер данасы String) {идентификатор = Identifier. TEXT; байт = ((Жол) деректер).getBytes (); } else {new 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 ()) {throw 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 (); }} /*** Екінші тараппен байланыс тірі немесе жоқ екенін қайтарады. * * @return True, егер байланыс тірі болса. Өтірік, әйтпесе. */ 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 Ерекшелікті кеңейтеді { / *** Хабар ретінде {@code null} болатын {@code NetworkException} құрады. * / public NetworkException () {} / *** Көрсетілген хабармен {@code NetworkException} құрастырады. * * @param хабарламасы Қатені сипаттайтын хабар. */ public NetworkException (String message) {супер (хабар); } /*** Көрсетілген хабар мен себеппен {@code NetworkException} құрады. * * @param хабарламасы Қатені сипаттайтын хабар. * @param себеп Қатенің себебі. */ public NetworkException (String message, Throwable səbəbi) {супер (хабар, себеп); } /*** Көрсетілген себеппен {@code NetworkException} құрастырады. * * @param себеп Қате себебі. */ public NetworkException (Throwable səbəbi) {супер (себеп); }}

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; Сервер сервері = жаңа Сервер (хост, порт); Клиент клиент = жаңа Клиент (хост, порт); Thread.sleep (100L); client.send («Сәлем.»); server.broadcast («Эй, жігіт!»); Thread.sleep (100L); server.disconnect (server.getConnections () [0]); // немесе client.close () клиенттік серверден ажырату үшін.close (); }}

Ұсынылған: