socketsenpython
Introduccionalossockets
Programarenredconpythonpuedecaeren2categorias,usarunmodulodeprotocolooprogramar
elprotocolodesdecero.
Lossocketssonunaextensiondelsistemadeentrada/salidadelsistemaoperativoquepermitela
comunicacionentreprocesosymaquinas.
Unsocketpermiteusarllamadasdelsistemaoperativoparahablarconotrasmaquinay/oprocesos
sobrelamaquinaqueloshallamado.
Algunasllamadasalsistemaen*nixquefuncionancondescriptoresdeficheronincluyenaopen(),
read(),write(),close().Undescriptordeficherotipicamenterefiereaunficheroounaentidadde
tipofichero;puedenser,directorios,bloques,socket,FIFO's.
Pythonproveeunainterfacedesocketdelsistemaoperativo,elmodulosocket,siesquesepiensa
disearelprotocolodesdecero.
Creacindeunsocket
Lacreacindeunsocketesdiferentedeunclienteaunserver.
Creacindeuncliente
Primero,setienequecrearelobjetosocket,luegoseletienequedefinirlafamiliadelprotocolo
(comosertransmitidaladata),yeltipodesocket(protocolousadoparatransmitirladata).
Familiasdeprocolo:socket.AF_UNIX,socket.AF_INET,socket.AF_INET6
Tipodesocket:socket.SOCK_STREAM,socket.SOCK_DGRAM,socket.SOCK_RAW,
socket.SOCK_RDM,socket.SOCK_SEQPACKET
Segundo,[Link]()enviaunatupla
conteniendoelhostremoto|direccinIPyelpuertoremoto.
host="[Link]"
port=80
#Creaciondelobjetosocket
s=[Link](socket.AF_INET,socket.SOCK_STREAM)#Conectandolohaciaunhostremoto
[Link](host,port)
Creacindeunserver
[Link],
luegoaadirlasopcionesdesocketsetsockopt();adems,setienequeasociarunpuertoauna
[Link],seaceptanlasconexiondelos
[Link]()enunaiteracininfinitahastaqueelprogramatermineolevanteuna
[Link].
host=''
port=9876
#Creaciondelobjetosockets=[Link](socket.AF_INET,socket.SOCK_STREAM)
#Definirlasopcionesdelsocket
[Link](socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#Asociarloaunpuerto+interface
[Link](host,port)
#[Link](3)
Comunicandoconsockets
Pythonprovee2manerasparaenviardataatravsdelared:objetosdesocket,yobjetostipofichero
[Link]().
Losobjetosdesocketseusancuandohayunanecesidaddecontrolareltamao,lostiempode
espera,ualgunotrodetalledeladataqueestasiendoescritaoleida.
Losobjetosdeficherosonmejoressisetrabajaconprotocolosorientadosaconexinyaquepueden
manejarelanlisissintcticodeladatarecibidaquehasidogarantizadaporelprotocolo.
Erroresenlatransmisinpuedenocurrirporvariosfactorestalescomo,ladesconexindeun
servidor,errordedireccionamiento,etc.Porellopythondefine4posiblesexcepciones:
[Link]/salida
[Link].
socket.herrorparaerroresdedireccionamientoparafuncionesqueusanh_errnoenC.
[Link]()sobreun
socket.
Loserroresconlosobjetostipoficherosenrealidadhacenunallamadaalsocketdelsistema,asique
[Link]
entreelemisoryelreceptor,porellohayqueasegurarenvio/[Link]()
antesderecibir/enviarnuevadata.
Sobretiemposdeesperaparadetectarymanejarerroresesutilizandotimeouts,conestosepuede
conseguirquepythondetecteinactividadenelsistemacuandohaycomunicacinentreelclientey
[Link],[Link]()enviandoeltiempolimiteen
segundos,[Link]
excepcin.
[Link](),
conestologramossocketsdeunasolavia(halfopensockets).Estoestilsiserequiereasegurar
quetodaladataescritahasidotransmitida,[Link]
elllamadoashutdownyasegurarquetodaladatahasidotransmitidaenesavia,elsocketnopodr
serusadonuevamente.
[Link]()requiereunargumentoparaindicarelmododefuncionamientoo
mododebloqueo.
0previenelecturas
1previeneescrituras
2previenelecturasyescrituras
CODIGODEEJEMPLO:
Elsiguienteejemploloherealizadoorientadoaconexinysinconexin,enamboselservidor
recibecomoparmetrounficherodelarbol*nixparaserlistadoyenviadoalcliente;paraejecutar
elficheroseranecesario2consolasabiertasoelservidorcorriendoen2doplano.
#./[script][fichero]
#./[Link]
#./[Link]/etc/
Clientesconpython
ClienteTCP
#!/usr/bin/python
#Clienteobjetosocket
importsocket,sys
host="[Link]"
port=10101
filename=[Link][1]
#Creaciondelobjetosocket(IPv4,TCP)
try:
s=[Link](socket.AF_INET,socket.SOCK_STREAM)
[Link],e:
print"Errorcreandoelsocket:%s"%e
#Conectandolohaciaunhostremoto
try:
[Link]((host,port))
[Link],e:
print"Errorconectandoalservidor%s"%e
try:
[Link](filename)
[Link],e:
print"Errorenviandodatos:%s"%e
while1:
try:
buf=[Link](2048)
[Link],e:
print"Errorreciviendodatos:%s"%e
ifnotlen(buf):
break
[Link](buf)
ClienteUDP
#!/usr/bin/python
importsocket,sys
host="[Link]"
port=10101
message=[Link][1]
try:
s=[Link](socket.AF_INET,socket.SOCK_DGRAM)
[Link],e:
print"Errorcreandoelsocket:%s:"%e
try:
[Link](message,(host,port))
[Link],e:
print"Errorenviandodatos:%s"%e
[Link](5)
while1:
try:
message,address=[Link](2048)
[Link]:
print"Cerradoporinactividad"
[Link](1)
[Link],e:
print"Errorrecibiendodatos:%s"%e
ifnotlen(message):
break
[Link](message+"\n")
Serversconpython
ServerTCP
#!/usr/bin/python
importsocket,pickle,os
host=""
port=10101
#Creaciondelobjetosocket(IPv4,TCP)
s=[Link](socket.AF_INET,socket.SOCK_STREAM)
#Definirlasopcionesdelsocket
[Link](socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#Asociarloaunpuerto+interface
[Link]((host,port))
#Ponerloaescucharporconexiones
[Link](3)
print"Corriendosobrepuerto%d;CtrlCparainterrumpir"%port
while1:
try:
csock,caddr=[Link]()
exceptKeyboadInterrupt:
raise
except:
traceback.print_exc()
continue
#Manejandolaconexion
try:
print"Clienteconectado",[Link]()
exceptKeyboadInterrupt:
raise
except:
traceback.print_exc()
while1:
try:
data=[Link](2048)
ifnotlen(data):
break
dir=[Link](data)
fordirindir:
[Link](dir+"\n")
[Link](1)
exceptKeyboadInterrupt:
raise
except:
traceback.print_exc()
[Link]()
ServerUDP
#!/usr/bin/python
#[Link]
importsocket,os
host=""
port=10101
s=[Link](socket.AF_INET,socket.SOCK_DGRAM)
[Link](socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
[Link]((host,port))
print"Corriendosobrepuerto%d;CtrlCparainterrumpir"%port
while1:
try:
message,address=[Link](2048)
print"Gotdatafrom",address
dir=[Link](message)
forlistdirindir:
[Link](listdir,address)
exceptKeyboardInterrupt:
raise
except:
traceback.print_exc()