Si të krijoni një aplikacion rrjeti në Java (me fotografi)

Përmbajtje:

Si të krijoni një aplikacion rrjeti në Java (me fotografi)
Si të krijoni një aplikacion rrjeti në Java (me fotografi)

Video: Si të krijoni një aplikacion rrjeti në Java (me fotografi)

Video: Si të krijoni një aplikacion rrjeti në Java (me fotografi)
Video: Si ta beni me te shpejte nje Samsung | Celular.al | 2024, Prill
Anonim

Shkrimi i kodit që ekzekutohet në një pajisje të caktuar është shumë i kënaqshëm. Por, shkrimi i kodit që ekzekutohet në disa pajisje që komunikojnë me njëri-tjetrin është thjesht pohues i jetës. Ky artikull do t'ju mësojë se si të lidhni dhe shkëmbeni mesazhe në rrjet duke përdorur protokollin e kontrollit të transmetimit (TCP).

Në këtë artikull, do të krijoni një aplikacion që do të lidhë kompjuterin tuaj me veten dhe, në thelb, do ta bëjë atë të çmendur - flisni me veten. Ju gjithashtu do të mësoni ndryshimin midis dy rrymave më të përdorura për rrjetëzimin në Java dhe si funksionojnë ato.

Të dhënat dhe rrjedhat e objekteve

Para se të zhyteni në kod, ndryshimi midis dy rrymave të përdorura në artikull duhet të dallohet.

Rrjedhat e të dhënave

Rrjedhat e të dhënave përpunojnë lloje dhe vargje primitive të të dhënave. Të dhënat e dërguara mbi transmetimet e të dhënave duhet të serializohen dhe deserializohen me dorë, gjë që e bën më të vështirë transferimin e të dhënave komplekse. Por, rrjedhat e të dhënave mund të komunikojnë me serverët dhe klientët e shkruar në gjuhë të tjera përveç Java. Rrjedhat e papërpunuara janë të ngjashme me rrjedhat e të dhënave në atë aspekt, por rrjedhat e të dhënave sigurojnë që të dhënat të formatohen në një mënyrë të pavarur nga platforma e cila është e dobishme sepse të dyja palët do të jenë në gjendje të lexojnë të dhënat e dërguara.

Rrjedhat e objekteve

Rrjedhat e objekteve përpunojnë lloje dhe të dhëna primitive të të dhënave që zbatojnë

Serializues

ndërfaqja. Të dhënat e dërguara mbi rrjedhat e objekteve serializohen dhe deserializohen automatikisht, gjë që e bën më të lehtë transferimin e të dhënave komplekse. Por, rrjedhat e objekteve mund të komunikojnë vetëm me serverët dhe klientët e shkruar në Java. Gjithashtu,

ObjektOutputStream

me fillimin, dërgon një kokë në

InputStream

të palës tjetër e cila, me fillimin, bllokon ekzekutimin derisa të merret titulli.

Hapa

Krijoni një Aplikacion Rrjeti në Java Step1
Krijoni një Aplikacion Rrjeti në Java Step1

Hapi 1. Krijo një klasë

Krijoni një klasë dhe emërtojeni si të doni. Në këtë artikull, do të emërohet

Shembull NetworkApp

klasa publike NetworkAppExample {}

Krijoni një Aplikacion Rrjeti në Java Step2
Krijoni një Aplikacion Rrjeti në Java Step2

Hapi 2. Krijo një metodë kryesore

Krijoni një metodë kryesore dhe deklaroni se mund të përjashtojë

Përjashtim

lloji dhe çdo nënklasë e tij - të gjitha përjashtimet. Kjo konsiderohet një praktikë e keqe, por është e pranueshme për shembujt e zhveshur.

klasa publike NetworkAppExample {public static void main (String args) hedh përjashtim {}}

Krijoni një Aplikacion Rrjeti në Java Step3
Krijoni një Aplikacion Rrjeti në Java Step3

Hapi 3. Deklaroni adresën e serverit

Ky shembull do të përdorë adresën e hostit lokal dhe një numër arbitrar të portit. Numri i portit duhet të jetë në një interval nga 0 në 65535 (përfshirë). Sidoqoftë, numrat e porteve që duhen shmangur variojnë nga 0 në 1023 (përfshirëse) sepse janë porte të rezervuara të sistemit.

klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; }}

Krijoni një Aplikacion Rrjeti në Java Step4
Krijoni një Aplikacion Rrjeti në Java Step4

Hapi 4. Krijoni një server

Serveri është i lidhur me adresën dhe portën dhe dëgjon lidhjet hyrëse. Në Java,

ServerSocket

paraqet pikën përfundimtare të serverit dhe funksioni i tij është pranimi i lidhjeve të reja.

ServerSocket

nuk ka rryma për leximin dhe dërgimin e të dhënave sepse nuk përfaqëson lidhje midis një serveri dhe një klienti.

import java.net. InetAddress; importoni java.net. ServerSocket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); }}

Krijoni një Aplikacion Rrjeti në Java Step5
Krijoni një Aplikacion Rrjeti në Java Step5

Hapi 5. Fillimi i regjistrimit të serverit

Për qëllime regjistrimi, printoni në tastierën e serverit të filluar.

import java.net. InetAddress; importoni java.net. ServerSocket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); }}

Krijoni një Aplikacion Rrjeti në Java Step6
Krijoni një Aplikacion Rrjeti në Java Step6

Hapi 6. Krijoni një klient

Klienti është i lidhur me adresën dhe portën e një serveri dhe dëgjon paketat (mesazhet) pasi të jetë krijuar lidhja. Në Java,

Prizë

përfaqëson ose një pikë përfundimtare nga ana e klientit e lidhur me serverin ose një lidhje (nga serveri) me klientin dhe përdoret për të komunikuar me palën në anën tjetër.

import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); }}

Krijoni një Aplikacion Rrjeti në Java Step7
Krijoni një Aplikacion Rrjeti në Java Step7

Hapi 7. Përpjekja për lidhjen e regjistrit

Për qëllime regjistrimi, printoni në tastierë që lidhja është përpjekur.

import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klienti i prizës = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); }}

Krijoni një Aplikacion Rrjeti në Java Step8
Krijoni një Aplikacion Rrjeti në Java Step8

Hapi 8. Krijoni lidhje

Klientët nuk do të lidhen kurrë nëse serveri nuk dëgjon dhe pranon, me fjalë të tjera krijon, lidhje. Në Java, lidhjet krijohen duke përdorur

prano ()

metoda e

ServerSocket

klasa Metoda do të bllokojë ekzekutimin derisa të lidhet një klient.

import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); }}

Krijoni një Aplikacion Rrjeti në Java Step9
Krijoni një Aplikacion Rrjeti në Java Step9

Hapi 9. Regjistroni lidhjen e krijuar

Për qëllime regjistrimi, printoni në tastierë që lidhja midis serverit dhe klientit është krijuar.

import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); }}

Krijoni një Aplikacion Rrjeti në Java Step10
Krijoni një Aplikacion Rrjeti në Java Step10

Hapi 10. Përgatitni rrymat e komunikimit

Komunikimi bëhet mbi rrjedhat dhe, në këtë aplikacion, rrymat e papërpunuara të (lidhjes) nga serveri (te klienti) dhe klienti duhet të lidhen me zinxhirë ose në transmetimet e të dhënave ose objektit. Mos harroni, të dyja palët duhet të përdorin të njëjtin lloj transmetimi.

  • Rrjedhat e të dhënave

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klienti i prizës = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); }}

  • Rrjedhat e objekteve

    Kur përdoren rrymat e shumta të objekteve, rrymat hyrëse duhet të inicializohen në të njëjtën mënyrë si rrymat dalëse sepse

    ObjektOutputStream

    i dërgon një kokë palës tjetër dhe

    ObjektInputStream

    bllokon ekzekutimin derisa të lexojë kokën.

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); }}

    Rendi siç specifikohet në kodin e mësipërm mund të jetë më i lehtë për t'u mbajtur mend - fillimisht filloni rrymat dalëse pastaj rrymat hyrëse në të njëjtin rend. Sidoqoftë, një urdhër tjetër për fillimin e rrjedhave të objekteve është si më poshtë:

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

Krijoni një Aplikacion Rrjeti në Java Step11
Krijoni një Aplikacion Rrjeti në Java Step11

Hapi 11. Regjistrohuni që komunikimi është gati

Për qëllime regjistrimi, printoni në tastierë që komunikimi është gati.

// kodi i lënë jashtë importit java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klienti i prizës = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); // kodi i hequr System.out.println ("Komunikimi është gati."); }}

Krijoni një Aplikacion Rrjeti në Java Step12
Krijoni një Aplikacion Rrjeti në Java Step12

Hapi 12. Krijo një mesazh

Në këtë aplikacion,

Përshendetje Botë

teksti do t'i dërgohet serverit ose si

bajt

ose

Varg

Me Shpallni një ndryshore të llojit që varet nga rryma e përdorur. Përdorni

bajt

për rrjedhat e të dhënave dhe

Varg

për rrjedhat e objekteve.

  • Rrjedhat e të dhënave

    Duke përdorur rrymat e të dhënave, serializimi bëhet duke shndërruar objektet në lloje të të dhënave primitive ose a

    Varg

    Me Në këtë rast,

    Varg

    është konvertuar në

    bajt

    në vend që të shkruhet duke përdorur

    writeBytes ()

    metodë për të treguar se si do të bëhej me objekte të tjera, të tilla si imazhe ose skedarë të tjerë.

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); System.out.println ("Komunikimi është gati."); byte messageOut = "Përshëndetje Botë".getBytes (); }}

  • Rrjedhat e objekteve

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); System.out.println ("Komunikimi është gati."); String messageOut = "Përshëndetje Botë"; }}

Krijoni një Aplikacion Rrjeti në Java Step13
Krijoni një Aplikacion Rrjeti në Java Step13

Hapi 13. Dërgoni mesazhin

Shkruani të dhëna në rrjedhën dalëse dhe shpëlajeni rrjedhën për të siguruar që të dhënat janë shkruar plotësisht.

  • Rrjedhat e të dhënave

    Gjatësia e një mesazhi duhet të dërgohet së pari në mënyrë që pala tjetër të dijë sa byte duhet të lexojë. Pasi gjatësia të dërgohet si një numër i plotë primitiv, bajtët mund të dërgohen.

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klienti i prizës = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); System.out.println ("Komunikimi është gati."); byte messageOut = "Përshëndetje Botë".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); }}

  • Rrjedhat e objekteve

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klienti i prizës = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); System.out.println ("Komunikimi është gati."); String messageOut = "Përshëndetje Botë"; clientOut.writeObject (messageOut); clientOut.flush (); }}

Krijoni një Aplikacion Rrjeti në Java Step14
Krijoni një Aplikacion Rrjeti në Java Step14

Hapi 14. Mesazhi i dërguar në regjistër

Për qëllime regjistrimi, printoni në tastierë që mesazhi është dërguar.

  • Rrjedhat e të dhënave

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); System.out.println ("Komunikimi është gati."); byte messageOut = "Përshëndetje Botë".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + String i ri (messageOut)); }}

  • Rrjedhat e objekteve

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); System.out.println ("Komunikimi është gati."); String messageOut = "Përshëndetje Botë"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + messageOut); }}

Krijoni një Aplikacion Rrjeti në Java Step15
Krijoni një Aplikacion Rrjeti në Java Step15

Hapi 15. Lexoni mesazhin

Lexoni të dhënat nga rryma hyrëse dhe konvertojini ato. Meqenëse e dimë saktësisht llojin e të dhënave të dërguara, ose do të krijojmë një

Varg

nga

bajt

ose të hedhura

Objekt

te

Varg

pa kontroll, në varësi të rrymës së përdorur.

  • Rrjedhat e të dhënave

    Ndërsa gjatësia u dërgua së pari dhe bajtët më pas, leximi duhet të bëhet në të njëjtin rend. Në rast se gjatësia është zero, nuk ka asgjë për të lexuar. Objekti deserializohet kur bajtet kthehen përsëri në një shembull, në këtë rast, të

    Varg

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); System.out.println ("Komunikimi është gati."); byte messageOut = "Përshëndetje Botë".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + String i ri (messageOut)); int length = serverIn.readInt (); nëse (gjatësia> 0) {bajt mesazhIn = bajt i ri [gjatësia]; serverIn.readFully (messageIn, 0, messageIn.length); }}}

  • Rrjedhat e objekteve

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); System.out.println ("Komunikimi është gati."); String messageOut = "Përshëndetje Botë"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + messageOut); String messageIn = (String) serverIn.readObject (); }}

Krijoni një Aplikacion Rrjeti në Java Step16
Krijoni një Aplikacion Rrjeti në Java Step16

Hapi 16. Regjistro mesazhin e lexuar

Për qëllime regjistrimi, printoni në tastierë që mesazhi është marrë dhe printoni përmbajtjen e tij.

  • Rrjedhat e të dhënave

    import java.io. DataInputStream; import java.io. DataOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); DataOutputStream clientOut = DataOutputStream i ri (client.getOutputStream ()); DataInputStream clientIn = DataInputStream i ri (client.getInputStream ()); DataOutputStream serverOut = DataOutputStream i ri (lidhje.getOutputStream ()); DataInputStream serverIn = DataInputStream i ri (lidhje.getInputStream ()); System.out.println ("Komunikimi është gati."); byte messageOut = "Përshëndetje Botë".getBytes (); clientOut.writeInt (messageOut.length); clientOut.write (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + String i ri (messageOut)); int length = serverIn.readInt (); nëse (gjatësia> 0) {bajt mesazhIn = bajt i ri [gjatësia]; serverIn.readFully (messageIn, 0, messageIn.length); System.out.println ("Mesazhi i marrë nga klienti:" + vargu i ri (messageIn)); }}}

  • Rrjedhat e objekteve

    import java.io. ObjectInputStream; import java.io. ObjectOutputStream; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); ObjectOutputStream clientOut = i ri ObjectOutputStream (client.getOutputStream ()); ObjectOutputStream serverOut = i ri ObjectOutputStream (connection.getOutputStream ()); ObjectInputStream clientIn = i ri ObjectInputStream (client.getInputStream ()); ObjectInputStream serverIn = i ri ObjectInputStream (connection.getInputStream ()); System.out.println ("Komunikimi është gati."); String messageOut = "Përshëndetje Botë"; clientOut.writeObject (messageOut); clientOut.flush (); System.out.println ("Mesazhi i dërgohet serverit:" + messageOut); String messageIn = (String) serverIn.readObject (); System.out.println ("Mesazhi i marrë nga klienti:" + messageIn); }}

Krijoni një Aplikacion Rrjeti në Java Step17
Krijoni një Aplikacion Rrjeti në Java Step17

Hapi 17. Shkëputni lidhjet

Lidhja shkëputet kur njëra palë mbyll transmetimet e saj. Në Java, duke mbyllur rrjedhën e daljes, priza e lidhur dhe rryma e hyrjes gjithashtu mbyllen. Pasi një palë në anën tjetër zbulon se lidhja është e vdekur, ajo duhet të mbyllë rrjedhën e saj të daljes, gjithashtu, për të parandaluar rrjedhjet e kujtesës.

// kodi i lënë jashtë importit java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); // kodi i hequr System.out.println ("Komunikimi është gati."); // kodi i lënë jashtë klientitOut.close (); serverOut.close (); }}

Krijoni një Aplikacion Rrjeti në Java Step18 V2
Krijoni një Aplikacion Rrjeti në Java Step18 V2

Hapi 18. Shkyçja e regjistrit

Për qëllime të regjistrimit, printimi në lidhjet e tastierës është shkëputur.

// kodi i lënë jashtë importit java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); // kodi i hequr System.out.println ("Komunikimi është gati."); // kodi i lënë jashtë klientitOut.close (); serverOut.close (); System.out.println ("Lidhjet u mbyllën."); }}

Krijoni një Aplikacion Rrjeti në Java Step19
Krijoni një Aplikacion Rrjeti në Java Step19

Hapi 19. Përfundoni serverin

Lidhjet janë shkëputur, por serveri është ende në punë. Si

ServerSocket

nuk shoqërohet me asnjë transmetim, duhet të mbyllet në mënyrë eksplicite duke telefonuar

mbyll ()

metodë.

// kodi i lënë jashtë importit java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); // kodi i hequr System.out.println ("Komunikimi është gati."); // kodi i lënë jashtë klientitOut.close (); serverOut.close (); System.out.println ("Lidhjet u mbyllën."); server.mbylli (); }}

Krijoni një Aplikacion Rrjeti në Java Step20
Krijoni një Aplikacion Rrjeti në Java Step20

Hapi 20. Përfundimi i serverit të regjistrit

Për qëllime regjistrimi, printimi në serverin e tastierës është përfunduar.

// kodi i lënë jashtë importit java.net. InetAddress; importoni java.net. ServerSocket; import java.net. Socket; klasa publike NetworkAppExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; ServerSocket server = serverSocket i ri (port, 50, InetAddress.getByName (host)); System.out.println ("Serveri filloi."); Klient klienti = Socket i ri (host, port); System.out.println ("Lidhja me serverin …"); Lidhja e prizës = server.accept (); System.out.println ("Lidhja e krijuar."); // kodi i hequr System.out.println ("Komunikimi është gati."); // kodi i lënë jashtë klientitOut.close (); serverOut.close (); System.out.println ("Lidhjet u mbyllën."); server.mbylli (); System.out.println ("Serveri përfundoi."); }}

Krijoni një Aplikacion Rrjeti në Java Step21
Krijoni një Aplikacion Rrjeti në Java Step21

Hapi 21. Përpiloni dhe ekzekutoni

Regjistrimi na mundësoi të dimë nëse aplikacioni ishte i suksesshëm apo jo. Prodhimi i pritshëm:

Serveri filloi. Po lidhet me serverin … Lidhja u krijua. Komunikimi është gati. Mesazhi i dërguar serverit: Përshëndetje Bota Mesazhi i marrë nga klienti: Përshëndetje Lidhjet Botërore u mbyllën. Serveri u mbyll.

Në rast se dalja juaj nuk është si ajo e mësipërme, e cila nuk ka gjasa të ndodhë, ka disa zgjidhje:

  • Nëse dalja ndalon në linjë

    Lidhja u krijua.

    dhe rrjedhat e objekteve përdoren, skuqeni secilën

    ObjektOutputStream

  • menjëherë pas fillimit sepse titujt, për ndonjë arsye, nuk u dërguan.
  • Nëse dalja printon

    java.net. BindException: Adresa tashmë është në përdorim

  • zgjidhni një numër tjetër porti sepse ai i specifikuar është përdorur tashmë.

Këshilla

  • Lidhja me një server në një rrjet të ndryshëm bëhet duke u lidhur me adresën IP të jashtme të një pajisjeje që drejton serverin që ka një portë të përcjellë.
  • Lidhja me një server në të njëjtin rrjet bëhet ose duke u lidhur me adresën IP private të një pajisjeje që drejton serverin ose duke përcjellë një port dhe duke u lidhur me adresën IP të jashtme të pajisjes.
  • Ka softuerë, të tillë si Hamachi, që lejojnë lidhjen me serverin në një rrjet të ndryshëm pa përcjellë një port, por kërkon instalimin e softuerit në të dyja pajisjet.

Shembuj

Aplikacionet e rrjetit që përdorin bllokimin e hyrjes/daljes duhet të përdorin fije. Shembujt e mëposhtëm tregojnë një zbatim minimalist të serverit dhe klientit me fije. Kodi i rrjetit është në thelb i njëjtë me atë në artikull, përveçse disa fragmente u sinkronizuan, u zhvendosën në fije dhe përjashtimet trajtohen.

Server.java

import java.io. IOException; import java.net. InetAddress; importoni java.net. ServerSocket; import java.net. SocketException; import java.net. UnknownHostException; import java.util. ArrayList; import java.util. Koleksione; import java.util. List; /*** Klasa {@kodi Server} përfaqëson një pikë përfundimtare të serverit në një rrjet. {@kodi Server} pasi lidhet me një adresë dhe port të caktuar IP *, krijon lidhje me klientët dhe është në gjendje të komunikojë me ta ose t'i shkëpusë ata. *

* Kjo klasë është e sigurt. * * @version 1.0 * @see Client * @see Connection */ public class Server zbaton Runnable {server privat ServerSocket; Lista private lidhjet; fije e fillit privat; lidhjet përfundimtare të objekteve privateLock = objekt i ri (); /** * Ndërton një {@kod server} që ndërvepron me klientët në emrin dhe portin e specifikuar të hostit me gjatësinë maksimale të kërkuar * të specifikuar të një radhe të klientëve në hyrje. * * @param host Adresa e hostit për t'u përdorur. * @param port Numri i portit për t'u përdorur. * @param backlog Kërkoi gjatësinë maksimale të radhës së klientëve të ardhur. * @throws NetworkException Nëse ndodh gabimi gjatë fillimit të një serveri. */ Serveri publik (String host, int port, int backlog) hedh NetworkException {try {server = server i ri Server (port, prapambetje, InetAddress.getByName (host)); } catch (UnknownHostException e) {hidhni NetworkException të ri ("Emri i hostit nuk mund të zgjidhet:" + host, e); } catch (IllegalArgumentException e) {hidhni NetworkException të ri ("Numri i portit duhet të jetë midis 0 dhe 65535 (përfshirëse):" + port); } catch (IOException e) {hidhni NetworkException të ri ("Serveri nuk mund të fillohej.", e); } lidhjet = Collections.synchronizedList (ArrayList e re ()); fije = fije e re (kjo); fije.filloj (); } /*** Ndërton një {@kod server} që ndërvepron me klientët në emrin dhe portin e specifikuar të hostit. * * @param host Adresa e hostit për t'u lidhur. * @param port Numri i portit për t'u lidhur. * @throws NetworkException Nëse ndodhin gabime gjatë fillimit të një serveri. */ serveri publik (String host, int port) hedh NetworkException {këtë (host, port, 50); } /*** Dëgjon, pranon dhe regjistron lidhjet hyrëse nga klientët. */ @Override public void run () {while (! Server.isClosed ()) {try {connections.add (Connection new (server.accept ())); } catch (SocketException e) {if (! e.getMessage (). është e barabartë ("Foleja e mbyllur")) {e.printStackTrace (); }} catch (NetworkException | IOException e) {e.printStackTrace (); }}} /*** Dërgon të dhëna për të gjithë klientët e regjistruar. * * Të dhënat e parapara Të dhënat për t'u dërguar. * @throws IllegalStateException Nëse shkrimi i të dhënave tentohet kur serveri është jashtë linje. * @throws IllegalArgumentException Nëse të dhënat për t'u dërguar janë nul. */ transmetim publik i pavlefshëm (Të dhënat e objektit) {if (server.isClosed ()) {hedhin IllegalStateException të ri ("Të dhënat nuk janë dërguar, serveri është jashtë linje."); } if (data == null) {hidhni IllegalArgumentException të ri ("të dhëna null"); } sinkronizuar (lidhjetLock) {për (Lidhja e lidhjes: lidhjet) {provo {lidhje.send (të dhëna); System.out.println ("Të dhënat i dërgohen klientit me sukses."); } catch (NetworkException e) {e.printStackTrace (); }}}} /*** Dërgon një mesazh shkyçjeje dhe shkëput klientin e specifikuar. * * lidhja @param Klienti të shkëputet. * @throws NetworkException Nëse ndodh gabim gjatë mbylljes së lidhjes. */ public void disconnect (Connection connection) hedh NetworkException {if (lidhjet.lëviz (lidhjen)) {connection.close (); }} /*** Dërgon një mesazh shkyçjeje për të gjithë klientët, i shkëput ata dhe përfundon serverin. */ public void close () hedh NetworkException {të sinkronizuar (lidhjetLock) {për (Lidhja e lidhjes: lidhjet) {try {connection.close (); } catch (NetworkException e) {e.printStackTrace (); }}} lidhjet.qartë (); provo {server.close (); } catch (IOException e) {hidhni NetworkException të ri ("Gabim gjatë mbylljes së serverit."); } më në fund {thread.interrupt (); }} /*** Kthen nëse serveri është apo jo në linjë. * * @return Vërtetë nëse serveri është online. E pavërtetë, përndryshe. */ public boolean isOnline () {return! server.isClosed (); } /*** Kthen një sërë klientësh të regjistruar. */ Lidhja publike getConnections () {sinkronizuar (lidhjetLock) {kthehu lidhjet.toArray (Lidhja e re [lidhjet. madhësia ()]); }}}

Klienti.java

import java.io. IOException; import java.net. Socket; import java.net. UnknownHostException; /*** Klasa {@code Client} përfaqëson një pikë përfundimtare të klientit në një rrjet. {@code Client}, pasi lidhet me një server të caktuar *, është e garantuar që të jetë në gjendje të komunikojë vetëm me serverin. Nëse klientët e tjerë i marrin apo jo të dhënat * varet nga zbatimi i serverit. *

* Kjo klasë është e sigurt. * * @version 1.0 * @see Server * @see Connection */ public class Klienti {lidhje private lidhje; /*** Ndërton një {@code Client} të lidhur me serverin në hostin dhe portin e specifikuar. * * @param host Adresa e hostit për t'u lidhur. * @param port Numri i portit për t'u lidhur. * @throws NetworkException Nëse ndodh gabimi gjatë fillimit të një serveri. */ public Client (String host, int port) hedh NetworkException {try {connection = new Connection (Socket i ri (host, port)); } catch (UnknownHostException e) {hidhni NetworkException të ri ("Emri i hostit nuk mund të zgjidhej:" + host, e); } catch (IllegalArgumentException e) {hidhni NetworkException të ri ("Numri i portit duhet të jetë midis 0 dhe 65535 (përfshirëse):" + port); } catch (IOException e) {hidhni NetworkException të ri ("Serveri nuk mund të fillohej.", e); }} /*** I dërgon të dhëna palës tjetër. * * Të dhënat e parapara Të dhënat për t'u dërguar. * @throws NetworkException Nëse shkrimi në rrjedhën dalëse dështon. * @throws IllegalStateException Nëse shkrimi i të dhënave tentohet kur lidhja është e mbyllur. * @throws IllegalArgumentException Nëse të dhënat për t'u dërguar janë nul. * @throws UnsupportedOperationException Nëse tentohet të dërgohet lloji i të dhënave të pambështetura. */ public void send (Object data) hedh NetworkException {connection.send (data); } /*** Dërgon një mesazh shkyçjeje dhe mbyll lidhjen me serverin. */ public void close () hedh NetworkException {connection.close (); } /*** Kthen nëse klienti është i lidhur ose jo me serverin. * * @return Vërtetë nëse klienti është i lidhur. E pavërtetë, përndryshe. */ public boolean isOnline () {return connection.isConnected (); } /*** Kthen shembullin {@link Connection} të klientit. */ public Connection getConnection () {lidhja e kthimit; }}

Lidhja.java

import java.io. DataInputStream; import java.io. DataOutputStream; import java.io. IOException; import java.net. Socket; import java.net. SocketException; /** * Klasa {@code Connection} përfaqëson ose një lidhje nga serveri te klienti ose një pikë përfundimtare e klientit në një rrjet * {@code Connection}, pasi të jetë lidhur, është në gjendje të shkëmbejë të dhëna me palë ose palë të tjera, në varësi në një server * zbatim. *

* Kjo klasë është e sigurt. * * @version 1.0 * @see Server * @see Client */ public class Connection zbaton Runnable {prizën e prizës private; DataOutputStream privat jashtë; privat DataInputStream në; fije fije private; Objekti privat përfundimtar writeLock = objekt i ri (); Objekti përfundimtar privat readLock = objekt i ri (); /*** Ndërton {@code Connection} duke përdorur transmetimet e një {@link Socket} të specifikuar. * * Foleja e parapara Socket për të marrë rrjedhjet nga.*/ Public Connection (Socket socket) hedh NetworkException {if (socket == null) {hidhni IllegalArgumentException të ri ("prizë null"); } this.socket = fole; provoni {out = new DataOutputStream (socket.getOutputStream ()); } catch (IOException e) {hidhni NetworkException të ri ("Nuk mund të hyj në rrjedhën dalëse.", e); } try {in = DataInputStream i ri (socket.getInputStream ()); } catch (IOException e) {hidhni NetworkException të ri ("Nuk mund të hyja në rrjedhën hyrëse.", e); } thread = fije e re (kjo); fije.filloj (); } /*** Lexon mesazhe ndërsa lidhja me palën tjetër është gjallë. */ @Override public void run () {while (! Socket.isClosed ()) {try {int identifikues; bajt bajt; sinkronizuar (readLock) {identifikues = in.readInt (); int gjatesi = in.readInt (); nëse (gjatësia> 0) {bajt = bajt i ri [gjatësia]; in.readFully (bytes, 0, bytes.length); } tjetër {vazhdo; }} switch (identifikues) {case Identifier. INTERNAL: Komanda e vargut = vargu i ri (byte); if (command.equals ("disconnect")) {if (! socket.isClosed ()) {System.out.println ("Paketa e shkyçjes u mor."); provo {mbyll (); } catch (NetworkException e) {return; }}} pushim; Identifikuesi i rastit. TEXT: System.out.println ("Mesazhi u mor:" + String i ri (byte)); pushim; parazgjedhur: System.out.println ("Të dhëna të panjohura të marra."); }} catch (SocketException e) {if (! e.getMessage (). është e barabartë ("Foleja e mbyllur")) {e.printStackTrace (); }} kap (IOException e) {e.printStackTrace (); }}} /*** I dërgon të dhëna palës tjetër. * * Të dhënat e parapara Të dhënat për t'u dërguar. * @throws NetworkException Nëse shkrimi në rrjedhën dalëse dështon. * @throws IllegalStateException Nëse shkrimi i të dhënave tentohet kur lidhja është e mbyllur. * @throws IllegalArgumentException Nëse të dhënat për t'u dërguar janë nul. * @throws UnsupportedOperationException Nëse tentohet të dërgohet lloji i të dhënave të pambështetura. */ public void send (Të dhënat e objektit) hedh NetworkException {if (socket.isClosed ()) {hidhni IllegalStateException të ri ("Të dhënat nuk janë dërguar, lidhja është mbyllur."); } if (data == null) {hidhni IllegalArgumentException të ri ("të dhëna null"); } identifikuesi int; bajt bajt; if (shembull i të dhënave të String) {identifikuesi = Identifikuesi. TEXT; byte = ((String) të dhëna).getBytes (); } else {hedh të reja UnsupportedOperationException ("Lloji i të dhënave i pambështetur:" + data.getClass ()); } try {synchronized (writeLock) {out.writeInt (identifikues); out.writeInt (bytes.gjatësia); jashtë.shkruaj (bajt); jashtë.flush (); }} catch (IOException e) {hidhni NetworkException të ri ("Të dhënat nuk mund të dërgoheshin.", e); }} /*** Dërgon një mesazh shkyçjeje dhe mbyll lidhjen me palën tjetër. */ public void close () hedh NetworkException {if (socket.isClosed ()) {hidhni IllegalStateException të ri ("Lidhja është mbyllur tashmë."); } try {byte message = "disconnect".getBytes (); sinkronizuar (writeLock) {out.writeInt (Identifikuesi. INTERNAL); out.writeInt (mesazhi.gjatësia); jashtë.shkruaj (mesazh); jashtë.flush (); }} catch (IOException e) {System.out.println ("Mesazhi i shkyçjes nuk mund të dërgohej."); } provoni {sinkronizuar (shkruajLock) {out.close (); }} catch (IOException e) {hidhni NetworkException të ri ("Gabim gjatë mbylljes së lidhjes.", e); } më në fund {thread.interrupt (); }} /*** Kthen nëse lidhja me palën tjetër është apo jo e gjallë. * * @kthehet Vërtetë nëse lidhja është e gjallë. E pavërtetë, përndryshe. */ public boolean isConnected () {return! socket.isClosed (); }}

Identifikuesi.java

/** * Klasa {@kod Identifikuesi} përmban konstante të përdorura nga {@link Connection} për serializimin dhe dezinfektimin e të dhënave * të dërguara në rrjet. * * @version 1.0 * @see Connection * / identifikues publik i klasës përfundimtare { / ** * Identifikues për mesazhet e brendshme. */ final publik statik int INTERNAL = 1; /*** Identifikuesi për mesazhet tekstuale. */ final publik statik int TEXT = 2; }

NetworkException.java

/*** Klasa {@kodi NetworkException} tregon një gabim në lidhje me rrjetin. * / klasa publike NetworkException shtrin përjashtimin { / *** Ndërton një {@kod NetworkException} me {@code null} si mesazh. * / publike NetworkException () {} / *** Ndërton një {@kod NetworkException} me mesazhin e specifikuar. * * @param message Një mesazh për të përshkruar gabimin. */ publike NetworkException (Mesazhi me varg) {super (mesazh); } /*** Ndërton një {@kod NetworkException} me mesazhin dhe shkakun e specifikuar. * * mesazhi @param Një mesazh për të përshkruar gabimin. * @param shkak Një shkak gabimi. */ publike NetworkException (Mesazhi me varg, Shkaku i hedhshëm) {super (mesazh, shkak); } /*** Ndërton një {@kod NetworkException} me shkakun e specifikuar. * * @param shkaktojnë Shkak i gabimit. */ publike NetworkException (Shkak i hedhshëm) {super (shkak); }}

PërdorimiShembull.java

/*** Klasa {@kodi UsageExample} tregon përdorimin e {@link Server} dhe {@link Client}. Këta shembuj përdorin * {@link Thread#gjumë (gjatë)} për të siguruar që çdo segment të ekzekutohet sepse fillimi dhe mbyllja e shpejtë bën që disa segmente * të mos ekzekutohen. * * @version 1.0 * @see Server * @see Client */ public class UsageExample {public static void main (String args) hedh Exception {String host = "localhost"; porti int = 10430; Server server = Server i ri (host, port); Klienti klient = klient i ri (host, port); Thread.sleep (100L); client.send ("Përshëndetje."); server.broadcast ("Hej, djalë!"); Thread.sleep (100L); server.shkëput (server.getConnections () [0]); // ose client.close () për t'u shkëputur nga serveri i klientit.close (); }}

Recommended: