SocketBasico - PythonBrasil [Link]
cgi/SocketBasico
SocketBasico
Receita: SocketBasico
Esta receita é baseada em um material que preparei para uso em aulas para demostrar a
programação básica para redes usando socket com a intensão de ser uma "prova de
conceitos" sobre o TCP/UDP.
Estrutura Básica de Programas para Rede
O Python implementa a interface de rede utilizando os fundamentos da API de
Socket.
Todo socket pode estar em modo ativo ou passivo.
Quando ele é criado ele esta no modo ativo.
Para o servidor poder ficar “escutando” um porta é necessário colocar o socket do
servidor em modo passivo.
Seqüência no Cliente:
1. Se foi fornecido um nome de hospedeiro converter em endereço IP;
2. Se foi fornecido um nome de protocolo de transporte converter em número;
3. Criar o socket (função socket);
4. Conecta com o servidor (função connect);
5. Enviar/Receber dados (permanecer nesse passo enquanto tiver dados para
enviar/receber);
6. Fechar o socket.
Seqüência no Servidor:
1. Se foi fornecido um nome de protocolo de transporte converter em número;
2. Criar o socket (função socket);
3. Coloca um endereço local, endereço IP e porta, no socket (função bind);
4. Instrui o sistema operacional para colocar o socket em modo passivo (função
listen);
5. Aceita uma nova conexão (função accept);
6. Enviar/Receber dados (permanecer nesse passo enquanto tiver dados para
enviar/receber);
7. Fechar o socket.
8. Volta ao passo 5 para aceitar outra conexão.
Os passos 4 e 5 do servidor são feito quando utilizamos protocolo de transporte
orientado a conexão (TCP).
O servidor tipicamente fica em laço infinito aceitando novas conexões.
Enquanto o servidor atende uma conexão ele fica dedicado a ela. Para evitar isso é
1 of 5 27-09-2006 17:15
SocketBasico - PythonBrasil [Link]
possível fazer um passo intermediário entre o 5 e o 6 para criar um novo processo ou
thread para tratar da nova conexão que esta chegando. Com isso o processo/thread
pai fica somente recebendo as conexões e o processo/thread filho trata das
requisições dos clientes.
Cliente e Servidor com UDP
Cliente UDP
Toggle line numbers
1 import socket
2
3 HOST = '[Link]' # Endereco IP do Servidor
4 PORT = 5000 # Porta que o Servidor esta
5
6 udp = [Link](socket.AF_INET, socket.SOCK_DGRAM)
7 dest = (HOST, PORT)
8
9 print 'Para sair use CTRL+X\n'
10
11 msg = raw_input()
12 while msg <> '\x18':
13 [Link] (msg, dest)
14 msg = raw_input()
15
16 [Link]()
=== Servidor UDP===
Toggle line numbers
1 import socket
2
3 HOST = '' # Endereco IP do Servidor
4 PORT = 5000 # Porta que o Servidor esta
5
6 udp = [Link](socket.AF_INET, socket.SOCK_DGRAM)
7 orig = (HOST, PORT)
8
9 [Link](orig)
10
11 while True:
12 msg, cliente = [Link](1024)
13 print cliente, msg
14
15 [Link]()
2 of 5 27-09-2006 17:15
SocketBasico - PythonBrasil [Link]
Cliente e Servidor com TCP
Cliente TCP
Toggle line numbers
1 import socket
2
3 HOST = '[Link]' # Endereco IP do Servidor
4 PORT = 5000 # Porta que o Servidor esta
5
6 tcp = [Link](socket.AF_INET, socket.SOCK_STREAM)
7 dest = (HOST, PORT)
8
9 [Link](dest)
10
11 print 'Para sair use CTRL+X\n'
12
13 msg = raw_input()
14 while msg <> '\x18':
15 [Link] (msg)
16 msg = raw_input()
17
18 [Link]()
Servidor TCP
Toggle line numbers
1 import socket
2
3 HOST = '' # Endereco IP do Servidor
4 PORT = 5000 # Porta que o Servidor esta
5
6 tcp = [Link](socket.AF_INET, socket.SOCK_STREAM)
7 orig = (HOST, PORT)
8
9 [Link](orig)
10 [Link](1)
11
12 while True:
13 con, cliente = [Link]()
14 print 'Concetado por', cliente
15 while True:
16 msg = [Link](1024)
17 if not msg: break
18 print cliente, msg
19 print 'Finalizando conexao do cliente', cliente
20 [Link]()
3 of 5 27-09-2006 17:15
SocketBasico - PythonBrasil [Link]
Servidor TCP Concorrente
Toggle line numbers
1 import socket
2 import os
3 import sys
4
5 HOST = '' # Endereco IP do Servidor
6 PORT = 5000 # Porta que o Servidor esta
7
8 tcp = [Link](socket.AF_INET, socket.SOCK_STREAM)
9 orig = (HOST, PORT)
10
11 [Link](orig)
12 [Link](1)
13
14 while True:
15 con, cliente = [Link]()
16 pid = [Link]()
17 if pid == 0:
18 [Link]()
19 print 'Concetado por', cliente
20 while True:
21 msg = [Link](1024)
22 if not msg: break
23 print cliente, msg
24 print 'Finalizando conexao do cliente', cliente
25 [Link]()
26 [Link](0)
27 else:
28 [Link]()
Usando Thread para Concorrência
Toggle line numbers
1 import socket
2 import thread
3
4 HOST = '' # Endereco IP do Servidor
5 PORT = 5000 # Porta que o Servidor esta
6
7
8 def conectado(con):
9 print 'Concetado por', cliente
10 while True:
11 msg = [Link](1024)
12 if not msg: break
4 of 5 27-09-2006 17:15
SocketBasico - PythonBrasil [Link]
13 print cliente, msg
14 print 'Finalizando conexao do cliente', cliente
15 [Link]()
16 [Link]()
17
18 tcp = [Link](socket.AF_INET, socket.SOCK_STREAM)
19 orig = (HOST, PORT)
20
21 [Link](orig)
22 [Link](1)
23
24 while True:
25 con, cliente = [Link]()
26 thread.start_new_thread(conectado, tuple([con]))
27
28 [Link]()
Volta para CookBook.
MarcioMinicz
last edited 2006-05-07 16:49:00 by MarcioMinicz
5 of 5 27-09-2006 17:15