Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Montaj aer conditionat in balcon ...

joc idem Half Life gratis

PC game stream catre Nvidia Shiel...

Pompa de apa HEPU ?!
 Vreau o masina electrica de tocat...

Cum ajunge remorca de tir inapoi ...

Alt "Utilizator nou" pe T...

ULBS INFORMATICA
 Index preturi

Boxa membrana tweeter infundata

Am nevoie de poze cu un curcubeu

Whisky for Mac
 Xiaomi 14 Gpay

Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...
 

Dezvoltarea aplicațiilor ce comunică pe net

- - - - -
  • Please log in to reply
104 replies to this topic

#91
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Plecand de la design-ul actual (ceea ce nu stiu daca e o idee buna), as putea face o clasa Server, ce se va ocupa de conexiune (eventual si ceva parsare), un StaticHandler si un DynamicHandler. Pentru ca ultimile 2 imprumuta destul de multe concepte comune, m-as gandi sa fac o clasa Handler, si StaticHandler si DynamicHandler sa fie "mostenitori".

#92
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostGady_paul, on 05 octombrie 2013 - 22:21, said:

Plecand de la design-ul actual (ceea ce nu stiu daca e o idee buna), as putea face o clasa Server, ce se va ocupa de conexiune (eventual si ceva parsare), un StaticHandler si un DynamicHandler. Pentru ca ultimile 2 imprumuta destul de multe concepte comune, m-as gandi sa fac o clasa Handler, si StaticHandler si DynamicHandler sa fie "mostenitori".
Am şi zis:

View PostOriginalCopy, on 05 octombrie 2013 - 15:55, said:

Identifică conceptele şi actorii importanţi din application domain şi introdu câte o clasă pentru fiecare.
Poate că numele claselor sunt bune, dar nu poţi pleca de la "designul actual" deoarece:
- nu întotdeauna vei avea un "design actual", de cele mai multe ori vei începe un proiect de la zero direct în OOP
- tu vrei să înveţi OOP, e o nouă paradigmă de programare, nu poţi sta cu vechea paradigmă în minte şi să te aştepţi să iasă ceva bun

Să zicem că clasele sunt bune, dar nu sunt toate.

În descrierea aplicaţiei se află ascunse mai toate clasele:

Aplicaţia mea este un daemon http care deserveşte conţinut clienţilor care se conectează şi trimit cereri.

Aproape fiecare al doilea cuvânt e câte un concept din aplicaţie.

#93
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008

View PostOriginalCopy, on 06 octombrie 2013 - 06:11, said:

Aplicaţia mea este un daemon http care deserveşte conţinut clienţilor care se conectează şi trimit cereri.

Am pictat cu rosu keywords care mi se par relevante. Deci, ar trebui (ca mai devreme), o clasa Server (care e si un soi de controller), Request, care se ocupa de primire cerere/parsare, ResolveStaticRequest/ResolveDynamicRequest pentru deservirea celor 2 tipuri de cereri, Client, care se ocupa de interactiunea cu clientul.

P.S. nelegandu-ma de aplicatie, daca vreau sa fac treaba X, si pentru asta am deja ceva functii existente intr-o biblioteca procedurala, se practica/se pot crea clase-wrapper care au ca scop interfatarea intre procedural si aplicatia mea oop?

#94
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostGady_paul, on 06 octombrie 2013 - 19:39, said:


Am pictat cu rosu keywords care mi se par relevante. Deci, ar trebui (ca mai devreme), o clasa Server (care e si un soi de controller), Request, care se ocupa de primire cerere/parsare, ResolveStaticRequest/ResolveDynamicRequest pentru deservirea celor 2 tipuri de cereri, Client, care se ocupa de interactiunea cu clientul.
Dacă ai Request, ar trebui să ai şi Response. Acum, vezi cum le îmbini.

View PostGady_paul, on 06 octombrie 2013 - 19:39, said:

P.S. nelegandu-ma de aplicatie, daca vreau sa fac treaba X, si pentru asta am deja ceva functii existente intr-o biblioteca procedurala, se practica/se pot crea clase-wrapper care au ca scop interfatarea intre procedural si aplicatia mea oop?
Depinde de priorităţile proiectului.

Dacă faci un rewrite şi nu vrei să mai expui nimic procedural, nu se practică.

Dacă biblioteca respectivă e mentenată separat, intern sau extern, şi rezolvă probleme pe care nu vrei să le mai rezolvi încă o dată, se practică.

Totul depinde de proiectul concret pe care-l ai în faţă, nu există reţete magice.

Şi în general, nu te lua după sfaturi măreţe, "reţete magice". Majoritatea deciziilor interesante sunt relative la proiectul concret.

#95
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Pentru ca cererea e in principiu de un fel, as putea face asa:
Server, Request, Client, Response (si StaticResponse/DynamicResponse ca mostenitori), caci rezolvarea cererii e practic generarea raspunsului.
Eventual se pot crea si clase gen GetRequest/PostRequest dar nu cred ca e cazul.

#96
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Deci, sunt pe drumul cel bun sau departe de el? :D

#97
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Am hotarat sa extind varianta procedurala cu signals/multithreading/servire dinamica a paginilor (nu era terminata).

Pe scurt, fiecare cerere sta intr-un nou thread. Cat despre cererile dinamice, folosesc execve. Problema in cazul acestora (am incercat si o abordare cu pipes, tot fara rezultat), este ca nu pot determina lungimea raspunsului. Din fericire, standardul HTTP spune pe undeva ca daca lungimea raspunsului nu este specificata, raspunsul se incheie odata cu incheierea conexiunii (scrie in primele randuri de aici: http://www.w3.org/Pr...html#BodyLength).

Nu pot determina response length fara a rula de 2 ori sau a stoca in memorie raspunsul (chestie nepractica), asa ca am zis sa il inchei prin terminarea conexiunii. Dupa umila mea parere (si dupa cum spune si telnet), conexiunea se inchide si continutul este transmis. Numai ca browserul nu se prinde de chestia asta.

Asta zice telnet cand vorbeste cu serverul:

GET /x.php HTTP/1.0
HTTP/1.0 200 OK
Location: localhost
Content-type: text/html; charset=UTF-8
array(0) {
}
NO AConnection closed by foreign host.


Si asta zice telnet cand vorbeste cu apache:
GET /x.php HTTP/1.1
Host: localhost
HTTP/1.1 200 OK
Date: Mon, 11 Nov 2013 19:16:09 GMT
Server: Apache/2.2.25 (Unix) mod_ssl/2.2.25 OpenSSL/1.0.1e DAV/2 PHP/5.5.3
X-Powered-By: PHP/5.5.3
Content-Length: 17
Content-Type: text/html
array(0) {
}
NO AConnection closed by foreign host.


Si nu in cele din urma, acesta este x.php:

<?php
var_dump($_GET);
if(isset($_GET['a'])){
	echo $_GET['a']*5;
}else{
	echo "NO A";
}



Aici sunt rezolvate cererile dinamice: https://github.com/P...r/src/dynamic.c
Aici se intampla fork, se rezolva cererea, se inchide conexiunea si se omoara copilu' (adica child reaping, sa nu va ganditi la prostii :D): https://github.com/P...ver.c#L101-L118
(ingorati printf-urile, au scopuri de debugging).

#98
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
PHP poate genera si el headere. Tii cont de ele?
Pentru site-uri dinamice nici nu prea are rost sa transmiti dimensiunea, ele oricum fiind relativ mici. Daca, prin php, trimiti defapt continutul unui fisier, setezi din php headerul cu dimensiunea corespunzatoare.

Apoi, in HTTP/1.0 conexiunea se inchide dupa fiecare cerere, doar HTTP/1.1 permite mai multe cereri succesive pe acceasi conexiune.
Ce intelegi prin "browserul nu se prinde"?

#99
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008

View Postdani.user, on 11 noiembrie 2013 - 21:58, said:

PHP poate genera si el headere. Tii cont de ele?

Nu, voi implementa si chestia asta.

View Postdani.user, on 11 noiembrie 2013 - 21:58, said:

Ce intelegi prin "browserul nu se prinde"?

Conexiunea e inchisa (nu asteapta/transfera date), dar pagina e goala sau nu arata nici o pagina.

#100
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Fa un debug de la View Source, la o analiza cu Wireshark (sub linux poti capta usor si loopback-ul).
Vezi sa nu fie si ceva din cauza cache-ului din browser.

#101
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Am curatat cache-ul si se comporta la fel.

Cat despre analiza cu wireshark, intrucat cunostintele mele nu sunt foarte vaste, am hotarat sa atasez aici niste screenshot-uri.
Primul screenshot reprezinta toate pachetele din timpul recording-ului, cu exceptia discutiilor cu routerul care nu cred ca sunt relevante in cazul de fata.
Inregistrarea a fost facuta pe 192.168.1.3, iar serverul rula pe 192.168.1.2. Se observa cererea http (pachetul 8). Pachetele 10 si 12 reprezinta headerele, respectiv body-ul response-ului, asa cum se vede in screenshot-ul 2. Datele sunt ele la locul lor, numai ca e interesat ca nu sunt recunoscute ca protocol HTTP de catre wireshark.

Attached Files


Edited by Gady_paul, 12 November 2013 - 22:24.


#102
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Right click si da-i sa-ti arate strict conversatia HTTP.

#103
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Cam asta e intreaga conversatie

Attached Files


Edited by Gady_paul, 12 November 2013 - 22:46.


#104
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Dupa ultimul header mai trebuie un rand liber lasat, inainte de continut.

#105
Gady_paul

Gady_paul

    Senior Member

  • Grup: Senior Members
  • Posts: 2,421
  • Înscris: 12.01.2008
Pfff, asta era. Multumesc mult.

Totusi, de ce daca ii spuneam content-length se descurca?

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate