descriere scurtă
În momentul în care am terminat doilea curs Universtiteta, una dintre lucrările de laborator cu privire la rata de chat Java a fost scris. După ce a înțeles Sockets subiect, serializarea obiect și MVC, aș dori să vă împărtășesc cu cititorii, mai ales pentru că mi-a ajutat incredibil în proiectul de scriere.
Și, desigur, voi lua în considerare toate erorile și omisiunile, care vor fi anunțate.
Un pic de teorie
Deci, pentru a începe cu. Proiectul va consta din două părți: client și server. Clientul va avea o interfață grafică, scris în biblioteca Swing. serverul GUI va fi nu numai log-file și o mică ieșire în consolă.
Pentru a scrie chat-ul, avem nevoie de ceva cunoștințe.
Din moment ce avem relația dintre client și server va fi implementat cu ajutorul prize, face cunoștință cu ei mai aproape.
Prize de curent (priza engleza -. Mufa jack Degajare) - numele interfeței software-ului pentru schimbul de date între procese. Socket - un obiect abstract care reprezintă punctul final de conexiune.
Fiecare proces poate crea un socket de ascultare (socket server) si se leaga-l la orice port sistem de operare. procesul de Listener, de obicei, este în ciclul de așteptare, adică, se trezește atunci când o nouă conexiune.
Pentru noi, acest lucru înseamnă că serverul va asculta orice port (pentru o mai mare flexibilitate, vom seta portul în fișierul de configurare) și apoi conexiunea client, el o acțiune va face.
Trecerea obiectelor pe rețea
Să nu vorbim despre argumente pro și contra fiecărei abordări. Noi folosim de-al doilea exemplu de realizare. (Și, dacă este nevoie, cândva mai târziu, voi scrie un al doilea)
Deci, ce este serializarea obiect.
procesul de transfer al unei structuri de date într-o secvență de biți - serializare. Dezavantajul la Pasul serializare este o operație deserializarea - restabilirea stării inițiale a structurii de date a secvenței de biți.
Serializare este utilizat pentru a transfera obiecte în rețea și pentru a le salva în fișiere.
În Java, singurul lucru pe care trebuie să serializa un obiect - pentru a implementa interfata Serializable, care este o interfață de marcaj, adică, nu conține nici metode.
Servere de scris
Deci, o scurtă descriere a serverului.
Serverul se execută într-un ciclu etern. De îndată ce un client nou se conectează, se creează pentru a lucra cu un nou fir notifică clienții deja conectat la noul utilizator și novice trimite un anumit număr de mesaje recente pe chat. Clientul, atunci când vă conectați în sine anunță unele informatsiiyu, precum și orice mesaj care identifică ceea ce tocmai a intrat.
Dar dincolo de aceasta, nu trebuie să uităm că clienții pot fi dezactivate. Adică, trebuie să comunice periodic cu semnale ale clienților (ping'ovat reciproc), astfel încât, dacă un client (sau întrerupătoarele de la server) totul aflat despre ea.
Să începem. Să creăm prima noastră clasă
Oh, da, noi vrem să obțineți numărul de port în fișierul de configurare. Pentru a crea o clasă de configurare separat, care va stoca câmp static - parametrii de chat-ul nostru.
Cel mai convenabil mod de a stoca setările în proprietăți fișier, în beneficiul Java oferă o interfață convenabilă pentru a lucra cu ei.
Deci noastre proprietăți de fișier va consta dintr-o singură linie (până în prezent)
PORT = 1234
Toți parametrii de încărcare sunt într-un bloc de inițializare statică ca un constructor plin, în cazul nostru - un lux.
Rămâne doar pentru a înlocui Server.java
ServerSocket socketListener = new ServerSocket ( "1234"); pe ServerSocket socketListener = new ServerSocket (Config.PORT); și se adaugă import'y necesare
În viitor, codul import'y va pierde, deoarece orice IDE propriul lor substitut.
Așa că am scris un nou ClientThread ();. Dar ceea ce nu este încă decis. Este timpul pentru a remedia problema.
Această clasă vom fi responsabili pentru primirea și transmiterea de mesaje între client și server, ceea ce înseamnă că cea mai importantă clasă în chat-ul - l ClientThread.
Din moment ce rulează într-un fir separat, primul lucru pe care trebuie să facem - scrie
Acum, gândiți-vă ce să scrie pe termen metoda ().
Deci, în ordine. Pentru început, avem nevoie pentru a obține informații de la client, „Cine ești tu?“ Altfel - „Hai, la revedere!“. De îndată ce am aflat cine este, avem nevoie pentru a trimite un mesaj ultimul în acest chat.
Mai mult decât atât, din când în când, trebuie să-l ping'ovat unele cerere pentru a se asigura că nu ține contactul cu un cadavru.
Apoi, trebuie să primim mesaje directe, care va notifica toți clienții conectați.
Ei bine, de îndată ce nu a primit nicio solicitare de la el - clientul ar trebui să fie eliminate de pe lista dostupnh utilizatori.
La acea vreme, ne uităm despre ClientThread, și gândiți-vă, „Cum comunicare? Va avea loc“
Am decis deja că vom trece un obiect serializat. Ei bine, bine să fie în acest obiect?
Am stabilit cu privire la următoarele:
1. ID-ul de utilizator care a trimis mesajul (sau Server-Bot)
2. De fapt, mesajul în sine
3. Timp de Expediere
4. O listă de servere la dispoziția clientului (pentru afișare la utilizator)
Pentru succes clasa serializare / deserializarea în client și serverul trebuie să fie identice. Prin urmare, am avea grijă de imediat și că și cealaltă.
Cred că totul este evident. De asemenea, în plus față de mesajele pe care le dorim să transmitem ceva de genul ping'ov.
Poate cineva va veni la client la îndemână :)
Am scris-o în câteva ore, și experiență în care se ocupă cu fluxul acolo, asa ca nu crap.
Total în fișier proiect 4:
privat static String NumedeUtilizator = «»;
static soclu Socket = null;
statice void main (String [] args) System.out.println publice ( «Bine ați venit la client de chat \ n!»);
System.out.println ( «Introduceți numele de utilizator și apăsați \» Enter \ »»);
// Crearea unui flux pentru citirea de la tastatura
BufferedReader tastatură = new BufferedReader (new InputStreamReader (System.in));
încercați // Ne așteptăm până când utilizatorul introduce un nume de utilizator și apasă tasta Enter
numeUtilizator = keyboard.readLine ();
System.out.println ();
> Captura (IOException e)
// Ia intrare și priza de ieșire fluxuri sunt acum posibilitatea de a primi și trimite date la client
InputStream InputStream = socket.getInputStream ();
OutputStream OutputStream = socket.getOutputStream ();
// Conversia fluxul în celălalt tip, pentru a face mai ușor să se ocupe de mesaje text
ObjectOutputStream ObjectOutputStream = new ObjectOutputStream (OutputStream);
ObjectInputStream ObjectInputStream = new ObjectInputStream (InputStream);
Noul PingThread (ObjectOutputStream, ObjectInputStream);
// Crearea unui flux pentru citirea de la tastatura
Mesajul String = null;
System.out.println ( «Introduceți mesajul și apăsați \» Enter \ »\ n»);
în timp ce (adevărat) / Бесконечный цикл
mesaj = keyboard.readLine (); // așteptați până când utilizatorul introduce ceva și apasă tasta Enter.
objectOutputStream.writeObject (nou mesaj (NumedeUtilizator, mesaj)); // trimite șirul de text introdus la server.
>
> Catch (Excepție e)
>
în cele din urmă, dacă încercați (priză! = null)
> Captura (IOException e)
>
>
>
ServerListenerThread public class implementează Runnable Filet privat = null;
privat ObjectOutputStream ObjectOutputStream = null;
privat ObjectInputStream ObjectInputStream = null;
ServerListenerThread publice (ObjectOutputStream ObjectOutputStream, ObjectInputStream ObjectInputStream) this.objectOutputStream = ObjectOutputStream;
this.objectInputStream = ObjectInputStream;
fir = new Subiect (acest lucru);
thread.start ();
>
@ Suprascriere
public void run () în timp ce încerca (true) Mesaj messageIn = (Mesaj) objectInputStream.readObject ();
dacă (messageIn instanceof ping) ping ping = (ping) messageIn;
objectOutputStream.writeObject (nou Ping ());
> System.out.println Else ( «[» + messageIn.getDate () toString () + ».]» + MessageIn.getLogin () + »» + messageIn.getMessage ().);
>
>
>
captura (SocketException e)
captura (ClassNotFoundException e)
catch (IOException e)
>
>
3, 4) Acesta este un server de fișiere protocol de transfer: Message.java și Ping.java
De fapt, asta e tot client. Și apoi s-au Boost funcționalitatea și inventa GUInyu ceea ce vrei)