Formularea problemei
Partea teoretică
În Berkeley Sockets care funcționează cu TCP a API conecta / accepta, pentru a efectua o strângere de mână cu trei căi, și apoi un ascuns de programator pentru a organiza modul de curgere, cu livrarea de control și integritatea datelor. Problema este că conntect / accepta un apel de blocare, și nu vă puteți conecta la mai multe porturi simultan (o priză), nu pentru a face și de a reduce sarcina pe dispozitivul de calcul (menținerea unui număr mare de conexiuni) au venit cu arhitectura client-server, în cazul în care serverul va agrega toate trafic ar trebui să fie trimise la el de către diferiți clienți și să mențină conexiuni multiple sunt aceleași.
Există două soluții la problema menținerii mai multor servere de conectare / acceptare: multithreading și utilizarea unor prize fără blocare. Voi lua în considerare primul caz, pentru că este mai aproape de mine.
desen
Imediat, soluția la problema accesului la resurse este plasată pe umerii bibliotecii utilizate, rămâne doar să se prescrie logica pentru prelucrarea datelor primite.
Cum am făcut-o
Pentru a scrie TCPConnectionHandler, trebuie să scrie mai întâi ThreadPool, care ar avea capacitatea de a crea și de a întrerupe fluxurile (fluxuri și separare între cei care sunt capabili să completeze și cei care sunt în lucru).
Și TCPConnectionHandler ar arăta care dintre conexiuni au fost terminate, responsabile pentru trimiterea de mesaje difuzate / multicast către prizele conectate și stocarea / distrugerea datelor de utilizator pe care le are socket-ul.
Structura datelor de utilizator ale soclului este destul de simplă - este porecla și chatroom. în care este localizat acest utilizator. Prin urmare, simplitatea utilizării unui astfel de mecanism pentru a crea o cameră, trebuie doar să intrați în ea.
Micro-Admin
Administrarea de servere care acceptă doar o conexiune deschisă (fără criptare) ar merita un articol separat cu privire la modul de a construi un sistem stabil de parole unice și comenzi hash, dar omite toate acestea. Am folosit doar posibilitatea de a scrie o cheie de text, și l-au comenzi pentru a efectua (În cazul în care lungimea cheii este suficient de mare câteva megaocteți, vă puteți proteja de forța brută), dar este greu pentru a vă proteja împotriva interceptării acestui = foarte cheie). Dar, teoretic, sistemul arată astfel:
- Serverul generează un număr de provocare sau un set de octeți.
- Clientul are o provocare cheie unică + comandă și otrăvește hash-ul și comanda în clar.
- Serverul re-tastează comanda cu provocare și compară rezultatul hash-ului cu cel primit.
- Dacă hash-ul este valid, atunci comanda este executată.
Exemple de comenzi
O cutie de bun venit cu un pic de ajutor.
Funcții ascunse de chat text
1. Schimbul de date privind chat-urile de tip hash
De exemplu, nici un utilizator sănătos nu ar trebui să stea în chatrume numit PbgkkCzrM8VToEgcDcCSfQdw5p1IaoRHiBu5d21XGv92c0fKmJUo3XoxFqtdN5tOzmRY5PrSQti6uKFOZTatQQ ==
Dar roboții sunt bine. Și schimbă aceste camere după un timp. Criptare transparentă în vizualizarea text Base64.
Suntem cu toții obișnuiți cu criptarea automată a datelor și cum va fi nostalgică să trimitem date interlocutorilor care au fost criptate cu chei pre-partajate. Anonimatul legat numai de portul ip: (hello, i2p) și autentificarea / autentificarea cu interlocutorii în cadrul sesiunii acceptate. 4. Luminozitatea datelor.
Nicio sarcină utilă suplimentară pentru suportul pentru sesiuni sau transferul de conținut. Numai conținutul textului. Un client simplu (nc, chit, etc) 6. Luminozitatea și performanța serverului
Pe mac, biblioteca utilizată și clientul compilat fără optimizări cântăresc 156 + 40 = 196 KB. Ie capacitatea de a rula pe dispozitive mai vechi, cu o cantitate mică de RAM și un suport minim pentru POSIX.7. OpenSource - deschidere, și nimic inutil. + abilitatea de a-și face propriile îmbunătățiri, precum criptarea, identificarea,
autentificare, transfer de fișiere etc.
GitHub, dar păstrați puternic impresionabil de la monitor.
CMake, vă permite să construiți sub platforma dvs. și să rulați pe gazda locală, mac / linux (+ ferestre în viitor, cu ajutorul dvs.).
Depunerea elementelor la cerere.