[PIPython] Dritte su come entrare nel mondo porte/streaming

Cris. Lor. htdcris
Ven 19 Nov 2004 15:16:44 CET


Ciao ragazzi (e non),
sono Cristian, piacere
è parecchio che non posto quindi mi sono ripresentato :-) ..

***** AVVERTENZA questo messaggio è ENORME ***** :-)

allora, 
se avete un quarto d'ora...  ;-) 
vengo subito al sodo, io sono un mega newbye, sto appena cominciando a imparare funzioni e moduli ma amo pormi degli obiettivi per poter andare avanti. Quindi ho deciso di fare qualcosa di difficile (per le mie attuali capacità) così da essere obbligato a imparare passaggio per passaggio come funzionano le cose in python e, soprattutto, come si ragiona per costruire un programma vero e proprio.

Sfogliando i vari doc sui moduli ho visto il modulo socket e mi sono chiesto se era possibile usarlo per "giochicchiare" con dei flussi di streaming ad esempio audio mp3.

Ad esempio con il DSP Oddcast plugin per winamp è possibile mandare un flusso audio mp3 ad una porta locale del pc. Poi se si possiede un server (software) di streaming, ad esempio Shoutcast o Icecast si può dirgli di accedere localmente a quella porta, "leggere" (o prendere o connettersi, non so come dire...)  il flusso che c'è e inviarlo ad uno o piu computer via internet. Ovviamente i server streaming hanno caratteristiche molto più avanzate, gestione di piu flussi e pc, buffers, gestione della banda ecc.. ma tutte queste cose per adesso non mi interessano, mi interessa sopratutto "l'atto" di "reindirizzare" un flusso mp3 letto su una porta di un pc (ad es locale) ad unaltro computer che la richiede su unaltra porta.

Naturalmente non vi chiedo di farmi il programmino al posto mio, piu che altro mi interessa sapere come devo ragionare per farlo.
E' proprio questo "come devo ragionare" che mi inquieta. 
Sto leggendo il libro "pensare da informatico, imparare con python", ma fatico a capire come si entra nell'ordine di idee tale da capire quale modulo fa al caso mio, come capire quali funzioni scegliere.

Mi interesserebbe molto sapere come ragionate voi esperti per risolvere questo problema.
io vorrei imparare da voi il "metodo" che il vostro cervello usa per scegliere i moduli e le funzioni giuste in questo caso per ottenere il risultato voluto.

Io per conto mio ho ragionato così (non scrivo codice ma mi piacerebbe se voi mi mostraste qualche piccolo esempio commentato):

1 -  Prima di tutto mi sono reso conto che leggere su una porta è diverso che leggere da un file
 quindi:
   A) mi sto studiando come si aprono i file per capire bene quello (come si leggono, bit per bit, riga per riga ecc..).
   B) devo capire quali sono le differenze nel leggere su una porta, ma penso che questo faccia parte del modulo socket (?)

2 -  Per connetermi su una porta devo sicuramente creare un socket
  quindi:
  A) Devo capire bene come funzionano i socket. Ho letto il manuale "socket howto" ma da li ho imparato solo che esistono i socket client e socket server ma ci sono solo due esempi su come usarli e scarsamente commentati per un newbye.
  B) Dato che devo prima connettermi alla porta per "leggere" il flusso mi vien da pensare che avrei bisogno di un socket client, ma dato che  poi devo accettare una richiesta da un altro computer che vuole che gli invii il flusso, mi sembra piu' ragionevole creare un socket server. Il socket server può funzionare inizialmente anche da client sulla porta locale? Oppure devo per forza creare prima un socket client per leggere e poi un socket server per inviare il flusso quando viene richiesto dall'altro computer?

3 -  Creato il socket devo ottenere il flusso
  quindi:
  A) devo studiarmi quali sono le funzioni che servono a "leggere" su una porta. (send/recv ?)
  B) il flusso viene preso "così com'è" o devo dirgli checcos' è? ad esempio mime/type? 
  C) quale modulo gestisce i mime/type? devo capire le funzioni da usare e come.
  D) le meta-informazioni vanno obligatoriamente gestite? o si possono ignorare per non complicare le cose?

4 - Ottenuto il flusso devo tenerlo da qualche parte almeno temporaneamente
 A) devo creare un buffer di tot secondi(?), kbit(?), pacchetti(?).
 B) devo capire quali funzioni definiscono e gestiscono l'esistenza del buffer e come funzionano
 C) devo rendere il buffer disponibile per la parte server

5 - Ottenuto il flusso devo poi inviarlo all'altro computer quando me lo richiede
  quindi:
 A) socket server deve accettare la richiesta su una porta
 B) deve "leggere" o "prendere" dal buffer il flusso di dati
 C) deve inviare il flusso all'altro computer 
 D) bisogna anche qui gestire mime/type? metainfo?

6 - Inviando devo usare un protocollo di trasferimento 
  quindi:
 A) Meglio usare il tcp anche se lento, l'udp perde pezzi per strada. Il "modo" in cui il flusso arriva all'altro computer o le condizioni in cui arriva per ora non hanno importanza, si presume che il computer richiedente usi un player mp3 (ad es winamp) in grado di gestire la riproduzione del flusso anche con pacchetti in ritardo o persi.
 B)  il protocollo di trasferimento fa già parte del socket server?
 C) Da dove tiro fuori il TCP? dal modulo socket o da moduli per la gestione network come twister?

7 - Come Inviare più flussi contemporaneamente
  A) devo creare un ciclo che gestisca contemporaneamente piu flussi.
  B) utilizzare la stessa porta per ogni flusso
  C) Creare thread per ogni flusso?
 

OK, mi fermo qui. 

Come avete visto mi interessa soprattutto capire che strada seguire per imparare come usare e come funzionano i vari pezzi che mi servono per ottenere il risultato finale.

Secondo voi ho scomposto bene il problema??
Pensate che debba seguire questa strada per imparare tutto quello che mi serve per creare il programma?

Vi sarei veramente molto grato se riusciste a darmi qualche dritta, magari indicandomi dove posso reperire le informazioni, su quali doc, quali manuali, che linea seguire per apprendere cio che mi serve. 
Io ho notato che la maggior parte dei manuali introduttivi danno solo gli strumenti base per cominciare a fare qualcosa ma poi danno per scontato che il resto lo si possa imparare automaticamente dasoli. Ma uno che non ha mai programmato prima, come sa che via prendere per continuare? Io ogni volta che scopro un modulo nuovo mi fermo a leggere gli help, ma dentro scopro che ci sono riferimenti complicati a cose che uno doveva già sapere! e dove le vado a trovare? E quando le trovo come faccio se scopro che al loro interno hanno altri riferimenti ad altre cose incomprensibili? Sembra una catena infinita... Imparare a macchia di leopardo a me sembra un metodo pessimo per comprendere le cose.
Voi come avete fatto?

Ok 

grazie per aver letto fin qui.

Ora credo debba aspettare qualche risposta senno' finisce che parlo solo io...
Più che una richiesta di delucidazioni, la mia, ha preso piu la forma di una richiesta di lezione privata sulla programmazione.. heheh.. :-)  ...non mi presenterete mica il conto vero??
Aparte gli scherzi.. 
non sentitevi in dovere di darmi una risposta.

Grazie 

Cristian

  Trieste

-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://list.zope.it/pipermail/python/attachments/20040319/d3cba37d/attachment.htm


More information about the Python mailing list