Crearea de rețele de bază pe exemplul unui chat consolă

Teoria - IP, port, soclu

Pentru a rezolva această problemă, este necesar, împreună cu informațiile de transfer de date cu privire la ce fel de program care le sunt destinate. Această informație este portul.

În acest caz, fiecare dintre programele (sau, mai degrabă, programatorii care le-a scris) trebuie să determine ce port vrea să comunice cu rețeaua. Serverul, la rândul său, ar trebui să fie, de asemenea, conștienți de faptul că portul și a trimite date pe el.

Cine este misteriosul acest port? Puteți lua o șurubelniță și du-te prin tot calculatorul, dar portul nu a găsit. Este doar un număr care este transmis cu datele. Teoretic, aceasta poate fi în intervalul de 1-65535, dar porturile 1..1024 programele de sistem utilizate și țineți-le nu este necesar. Prin urmare, portul ar trebui să fie selectat din intervalul 1025..65535.

Chiar și într-un astfel de program simplu cum ar fi chat-ul, nu doar urca in a scrie ceva neinteligibil idei. În primul rând, trebuie să înțelegem teoria, cu care suntem familiarizați (nu-l dor, nu?) Și să înțelegem ce înseamnă, în contextul programului nostru.

În primul rând, în proiecte care sunt proiectate pentru a lucra cu rețeaua, aveți nevoie de două programe (nu acelasi ea însăși trimite mesaje). Una dintre ele este serverul. iar celălalt - client. Prin urmare, prima consecință:

  • Necesită două moduri de funcționare ale programului - server și client

Este posibil să se creeze fie două programe diferite, sau unul și cere utilizatorului mod care să-l rulați. Prima metodă este mai bună decât faptul că serverul nu trebuie să stocheze fișierele pentru partea de client. Pe de altă parte, astfel încât să se verifice funcționarea serverului, iar clientul va trebui să descărcați și să ruleze două programe diferite. Să considerăm a doua modalitate - într-un singur program, în funcție de dorințele dumneavoastră, vom rula modul de server sau client.

Atunci este timpul să se gândească la arhitectura. Cu doi utilizatori toate ușor - ei doar trimit reciproc posturile lor. Dar, după cum știm, ne-am planificat pentru a discuta mai mulți jucători. Păstrați fiecare client o listă a tuturor altor utilizatori fără rost (trebuie să se înțeleagă că, în acest caz, clientul și utilizatorul - același lucru). Prin urmare, vom face acest lucru:

  • Serverul va fi unul, iar utilizatorii - orice număr. Fiecare utilizator se conectează la server și trimite mesajele. Serverul păstrează o listă de utilizatori conectați, și le trimite la toate mesajele primite.

Și ultimul lucru pe care trebuie să înțeleagă este protocolul - algoritmul de programe de interacțiune pe rețea. Este evident că atât serverul și clientul trebuie să trimită mesaje unul altuia într-un singur algoritm. La urma urmei, dacă un client trimite un șir de caractere, în timp ce serverul va aștepta numărul, ei nu vor înțelege reciproc, și nu va funcționa corect.

Fiecare utilizator va fi multe, ar fi frumos pentru a identifica într-un fel. Pentru a face acest lucru, după ce ați conectat clientul trebuie să trimită serverul un pseudonim. Apoi, clientul trimite un mesaj la chat-ul, până când un alt mesaj nu este egal cu «ieșire». Acest lucru înseamnă că utilizatorul dorește să părăsească camera de chat și închideți programul.

program de scris

Acum, că tot timpul de pregătire sunt clare, puteți rupe la cele mai interesante - scrierea programului.

Fișiere și structura de pachete

Desigur, știi că orice program de pe Javanachinaetsya cu metoda principală (String [] args). Pentru o mai mare claritate, nu se va adăuga la alte clase, și de a crea un pachet separat Maini clasa pentru el - principal. În orice program probabil va fi unele constante. Prefer să le facă într-un fișier separat în forma publicstaticpoley, astfel se va crea, de asemenea, clasa Consti adăuga la pachetul principal.

După cum ne amintim, programul ar trebui să funcționeze în mod client sau server. Creați două respectiva clasă Server Clienti.

Ca rezultat, arborele pachetului arată astfel:

Crearea de rețele de bază pe exemplul unui chat consolă

Selectarea modului de operare

În primul rând trebuie să alegeți modul pentru a rula programul - server sau client. Ceea ce avem nevoie în primul rând pentru a învăța de la utilizator, astfel încât metoda principală (...), tastați următoarele:

Aici totul este destul de simplu - întrebați cum să executați programul, citiți scrisoarea de răspuns și a alerga clasa corespunzătoare. Ar trebui să fie explicate numai pe scanerul de clasă - o bibliotecă standard de clasă pe care îl face ușor de a lucra cu datele de intrare de la consola. Acesta este inițializat la un flux de intrare standard de.

modul client

Să mergem de la simplu la complex și mai întâi implementează modul client.

Dacă serverul este abia a început și aștept cu nerăbdare să utilizatori, clienții trebuie să prezinte o anumită activitate, și anume - pentru a se conecta la server. Pentru a face acest lucru, trebuie să știți portul de conectare IPI. Portul este o constantă, astfel încât să-l cere să Const.java:

Constobyavlen ca abstract, deoarece Acesta conține numai date statice și de a crea o instanță a acesteia, nimic.

IPdolzhen intra utilizator, astfel încât scrie constructor Client:

Acum avem toate datele necesare - IP, portul, modul de funcționare a programului. Vă puteți conecta la server. Mai întâi, creați un soclu:

În acest caz, odată ce conexiunea este făcută și puteți trimite și citi date. Dar cum se face acest lucru în cazul în care datele sunt transmise numai prin fluxuri? Fiecare intrare și ieșire Socketsoderzhit fluxuri InputStreami clasa OutputStream. Se poate lucra direct cu ei, dar este mai bine pentru comoditatea de „wrap“ le în ceva mai funcționale:

Orice operațiuni cu filet și prize de curent trebuie să fie efectuate în cadrul try..catch unitate de tratare a erorilor.

Acum puteți porni serverul de mesagerie. După cum ne amintim, protocolul trebuie să treacă mai întâi un nume de utilizator și apoi introduse de către fiecare (în consolă) mesajul este trimis la server. Deci, vom face:

println) Metoda (outotpravlyaet obiect de date la server, și metoda readLine () obiect în- citește datele primite. Dar cum putem imprima la mesajele primite de la consola server? La urma urmei, trebuie să ne așteptăm simultan mesaje de la consola (utilizatorul) și mesajele din fluxul (de la server). Va trebui să facem pentru a crea un fir suplimentar.

clasa Java care pune în aplicare filetate un astfel de lucru indispensabil ca multithreading. Aceasta este o oportunitate de a realiza programul în același timp, un set diferit de acțiuni. Doar ceea ce avem nevoie acum.

Să ne crea o clasă internă, care va primi mesaje de la server și de a le afișa la consolă.

Până atunci, până când debitul este oprit, se citește pur și simplu toate mesajele de pe server și le afișează în consolă.

În constructor, vom crea un obiect al acestei clase și să înceapă un fir:

Rezultată Client.java fișier cu ceilalți listate la sfârșitul articolului.

modul de server

Server, spre deosebire de clientul nu funcționează cu clasa Socket, și cu ServerSocket. La crearea obiectului său, programul nu se conectează nicăieri, ci pur și simplu creează un server de pe portul trecut la constructor.

Întreaga logică a lucrului cu un anumit utilizator va fi în clasa Connection interioară și Serverbudet acceptă numai noi conexiuni și să funcționeze existente. Să începem „de jos“ și de a crea o conexiune de clasă, care ar trebui să ia utilizatorul la mesaj într-un fir separat, și le trimite altor clienți:

conexiunea este o matrice cu toate conexiunea utilizatorului. Când aveți nevoie pentru a trimite un fel de mesaj tuturor, am iterează prin această matrice și apel la fiecare client.

Designer, precum și în clasa de Client, convertește fluxurile asociate cu priza. run () metoda se execută într-un fir separat și se desfășoară în paralel cu restul programului. În ea, conform protocolului, citiți mai întâi numele de utilizator, și apoi toate celelalte mesaje sunt trimise tuturor clienților de chat. Atunci când sosește un mesaj „ieșire“, utilizatorul este deconectat de la chat-ul, și toate fluxurile de aproape apropiat () metoda asociată cu ea.

Acum trebuie doar să creați un server care va accepta conexiunile de intrare, pentru a crea obiecte Connectioni le adăuga la matrice. În write Server clasa constructor:

server.accept () metoda spune server pentru a asculta pentru conexiuni. De îndată ce unele client se conectează la server, metoda returnează obiectul Socket, asociat cu această conexiune. Apoi creează un obiect Connection, inițializat la acest soclu și se adaugă la matrice. Nu uita sfârșitul try..catchi aproape toate prize cu o closeAll metoda de streaming ();

Vlad_Lastname katch Slewcel Letos Darwind_ skilgal Andrey_G c0nst andrfas Ambal memor1s Litman Amboss un1acker Baev88 mărar dozor720 Bunny911 pristroistvo_ek SkunS Fesya alexace013 gio băgăcios valeska114 hardxx