Ir para conteúdo
Fórum Script Brasil
  • 0

Socket Em Python, Como Interagir? -- Enfim Resolvido


sidneivl

Pergunta

Fala pessoal,

Sou iniciante em programação python, hoje atualmente sou programador action script, php, postgre e mysql.

Também conheço asp e mssql.

Como trabalho com web sempre ouvi falar de python e agora me interessei, já que preciso desenvolver uma aplicação flash onde me comunico com o servidor que faz a comunicação de usuários.

Foi assim que cheguei ao python.

A parte de linguagem já fiz o que precisava para ter meu inicio no meu pequeno projeto, toda a sintaxe que necessito já utilizei sem maiores problemas, mas o que estou me complicando todo e na parte onde tenho que fazer os usuários se comunicarem pela interface flash.

Então pesquisei a parte de socket no python e estou quebrando muito minha cabeça, pareço mais um surdo em um quarto escuro :blink:

Então recorri a vocês.

Já li vários tutoriais e documentações, mas se tratando de socket, que é algo mais avançado na linguagem, me sinto extremamente perdido.

Hoje o que tenho é o seguinte:

import socket
HOST = ''              # Endereco IP do Servidor
PORT = 5000            # Porta que o Servidor esta
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
orig = (HOST, PORT)
tcp.bind(orig)
tcp.listen(1)
while True:
    con, cliente = tcp.accept()
    print 'Concetado por', cliente
    while True:
        msg = con.recv(1024)
        if not msg: break
        print cliente, msg
    print 'Finalizando conexao do cliente', cliente
    con.close()

E pelo que entendi disso é o seguinte:

- importo o módulo socket do python

- defino porta e servidor

- instancio a variavel tcp com o tipo de protocolo que estou usando para utilizar o socket

- tenho a função bind que não entendi muito bem, mas acho que é a a criação do servidor

- tenho a função listen que seria quantas conexões o socket vai aceitar

- o while pelo que entendi seria um looping que o socket fica para ficar escutando a porta para receber as conexões

- msg acho que é avariavel que o socket vai recever

- faz a verificação se tem msg ou não

- e por fim fecha o socket.

Utilizei outro código para acessar esse socket mas nada aconteceu, verifiquei que quando rodo esse script eu instancio um serviço python no meu sistema que é um WINDOWS

Agora vem as dúvidas:

- Como faço para rodar esse serviço toda vez que meu computador ligar?

- Como me conecto a esse socket?

- Como recebo o retorno desse socket?

Bom acho que isso é um começo, hehehehe

Espero que alguém possa me ajudar....

Esse tópico poderia ser o inicio de um estudo sobre socket em pyhon, já que esse assunto é tão escaço na internet, ainda mais em portguês...

PS.: Desculpem pelo post gigantesco :P

Editado por sidneivl
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Fala pessoal,

Sou iniciante em programação python, hoje atualmente sou programador action script, php, postgre e mysql.

Também conheço asp e mssql.

Como trabalho com web sempre ouvi falar de python e agora me interessei, já que preciso desenvolver uma aplicação flash onde me comunico com o servidor que faz a comunicação de usuários.

Foi assim que cheguei ao python.

A parte de linguagem já fiz o que precisava para ter meu inicio no meu pequeno projeto, toda a sintaxe que necessito já utilizei sem maiores problemas, mas o que estou me complicando todo e na parte onde tenho que fazer os usuários se comunicarem pela interface flash.

Então pesquisei a parte de socket no python e estou quebrando muito minha cabeça, pareço mais um surdo em um quarto escuro :blink:

Então recorri a vocês.

Já li vários tutoriais e documentações, mas se tratando de socket, que é algo mais avançado na linguagem, me sinto extremamente perdido.

Hoje o que tenho é o seguinte:

import socket
HOST = ''              # Endereco IP do Servidor
PORT = 5000            # Porta que o Servidor esta
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
orig = (HOST, PORT)
tcp.bind(orig)
tcp.listen(1)
while True:
    con, cliente = tcp.accept()
    print 'Concetado por', cliente
    while True:
        msg = con.recv(1024)
        if not msg: break
        print cliente, msg
    print 'Finalizando conexao do cliente', cliente
    con.close()

E pelo que entendi disso é o seguinte:

- importo o módulo socket do python

- defino porta e servidor

- instancio a variavel tcp com o tipo de protocolo que estou usando para utilizar o socket

Até aqui ok.

- tenho a função bind que não entendi muito bem, mas acho que é a a criação do servidor

Este método serve para atribuir a porta (e o endereço) do servidor ao socket.

- tenho a função listen que seria quantas conexões o socket vai aceitar

- o while pelo que entendi seria um looping que o socket fica para ficar escutando a porta para receber as conexões

- msg acho que é avariavel que o socket vai recever

- faz a verificação se tem msg ou não

- e por fim fecha o socket.

Até aqui ok, também.

Utilizei outro código para acessar esse socket mas nada aconteceu, verifiquei que quando rodo esse script eu instancio um serviço python no meu sistema que é um WINDOWS

Nada aconteceu de qual lado? E qual o código utilizado?

Agora vem as dúvidas:

- Como faço para rodar esse serviço toda vez que meu computador ligar?

Você pode colocar o código em um arquivo .py e colocar ele para ser inicializado com o Windows (no item Inicializar do Menu Iniciar -> Programas - é a maneira mais fácil, mas existem outros meios).

- Como me conecto a esse socket?

Pelo que você disse você já utilizou um código para se conectar. Talvez ele esteja correto.

- Como recebo o retorno desse socket?

O código ali em cima não envia nada para o cliente, pelo contrário, ele só recebe algo que o cliente envie. Uma vez estabelecida a conexão, o envio de dados do servidor para o cliente é do mesmo jeito que o contrário (do cliente para o servidor), ou seja, através do método Send().

Bom acho que isso é um começo, hehehehe

Espero que alguém possa me ajudar....

Esse tópico poderia ser o inicio de um estudo sobre socket em pyhon, já que esse assunto é tão escaço na internet, ainda mais em portguês...

Eu já escrevi um tutorial de sockets, porém era para Visual Basic. Sendo que a idéia de sockets é a mesma para todas as linguagens, então acho que vale a pena dar uma lida, mesmo que seja só para pegar o conceito: http://www.onmasters.com.br/artigos/64/

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Fala Graymalkin,

Seus comentários me ajudaram...

No seu tópiuco vou dar uma lida com mais calma...

Consegui fazer um script em python que mandasse uma mensgaem e dependendo da mensagem o socket respode alguma coisa...

:D

Mas meu desafio é fazer a comunicação entre python e flash e já tive um excelente resultado, consigo enviar a mensagem do flash para o python tranquilamente utilizando o xmlsocket, que é a unica forma fácil de fazer o flash se conectar com um socket.

Mas não consigo recuperar o que o socket manda via send, no flash tenho uma função onData que seria o que fica esperando a resposta do socket, mas nada acontece, talvez eu tenha que retornar um xml, vou estudar melhor isso...

Agora tenho um problema aqui, quando mando uma msg do flash vejo no python que chega tranquilamente, mas se eu mando outra msg do flash o serviço que segura meu socket cai e o software que estou usando pra rodar ele trava....o que pode ser?

não recebo nenhuma exception....

Para rodar um arquivo python vi que precisa ter um negócio na primeira linha como:

#! usr/bin/python

Que eu acho que seria o caminho do interpretador no linux, no windows seria:

#! c:\python24\

ou não precisa disso?

Vamos caminhando, daqui alguns dias teremos um ótimo conteúdo de pesquisa aqui ;)

Link para o comentário
Compartilhar em outros sites

  • 0
Agora tenho um problema aqui, quando mando uma msg do flash vejo no python que chega tranquilamente, mas se eu mando outra msg do flash o serviço que segura meu socket cai e o software que estou usando pra rodar ele trava....o que pode ser?

não recebo nenhuma exception....

Bom, aquele loop ali no código espera por somente um dado. Após o recebimento deste, o loop é terminado e o programa finaliza. Se você não alterou para que ele repita ou continue o loop, pode ser este o problema.

Para rodar um arquivo python vi que precisa ter um negócio na primeira linha como:

#! usr/bin/python

Que eu acho que seria o caminho do interpretador no linux, no windows seria:

#! c:\python24\

ou não precisa disso?

Não, não precisa. Se você está usando o Windows XP ou superior, basta digitar o nome completo do arquivo (inclusive com a extensão .py) para que ele seja executado no prompt.

Vamos caminhando, daqui alguns dias teremos um ótimo conteúdo de pesquisa aqui ;)

De fato, vamos movimentar essa área! :)

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Tive um grande avanço esses dias com o estudo de integração de socket python com o flash graças a ajuda do Graymalkin aqui do fórum e um amigo meu (Daniel Dalben) que também programa, além dos cookbooks do pythonbrasil.com.br.

Vamos ao novo código:


import socket #importa a classe socket
import thread #importa a classe thread
import xml.dom.minidom #importa a classe minidom

HOST = '' # Endereco IP do Servidor
PORT = 5000 # Porta que o Servidor esta

tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #cria o socket
orig = (HOST, PORT)
tcp.bind(orig) #abre o socket no ip e porta
tcp.listen(999) #quantos ouvintes o socket vai ter

#função quando alguém estiver conectado através da abertura de uma thread
def conectado(con, cliente):
print 'Conectado por', cliente

#fica em loooping recebendo as entradas da thread
while True:
msg = con.recv(1024) #recebe a mensagem do cliente

x = xml.dom.minidom.parseString(msg) #pega o xml de uma string
nos = x.documentElement #pega o xml como um document

varChegou = nos.childNodes[0].data #pego o valor contido no primeiro nó

print 'dataNo: ' + varChegou

#trato o resultado do nó, escrevo um xml e reenvio para o cliente
if varChegou == "ok":
msgEnvia = "<teste>"
msgEnvia += "<noh>Teste01</noh>"
msgEnvia += "</teste>"
con.send(msgEnvia + '\ 0')
print 'ok'
else:
msgEnvia = "<teste>"
msgEnvia += "<noh>Teste02</noh>"
msgEnvia += "</teste>"
con.send(msgEnvia + '\ 0')
print 'nada ok'

print 'Finalizando conexao do cliente', cliente
con.close()
thread.exit()

#looping para ficar recebendo as conexões
while True:
con, cliente = tcp.accept() #aceita a conexão e pega os dados do cliente
thread.start_new_thread(conectado, tuple([con, cliente])) #inicia uma nova thread

tcp.close()
[/codebox]

NOTEM - no final da string que vai ser enviada existe um isso foi uma dica preciosa de Daniel Dalben, que me explicou que no final da string é necessário um bit 0, onde outras linguagens como c, java entre outras recebem o string sem problemas, mas o flash não, então com o a msg chega tranquilamente no flash e pode ser tratada, mas tenho um grande problema:

PROBLEMA:

Quando recebo a string vinda de um cliente python tudo acontece, mas quando recebo a string vinda do flash nada acontece e dá erro (Unhandled exception in thread started by <function conectado at 0x018D0E30>)

dando um print type(msg) o python me retorna 'str', ai vem a pergunta, se ambos vem str porque quando a string (que é um xml) vem do flash não é reconhecido como tal???

Tem alguma forma de transformar essa string em uma string válida para o xml.dom.minidom.parseString???

já tentei dar str() mas nada, e o não funciona nesse caso....

Alguém tem uma luz?

Editado por sidneivl
Link para o comentário
Compartilhar em outros sites

  • 0

Você está recebendo o conteúdo *todo* do XML antes de passar para xml.dom.minidom.parseString()? Talvez o socket só esteja recebendo uma parte do XML. Você já experimentou exibir o conteúdo de msg para verificar se a estrutura está toda lá?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, chega todo o xml, até que se eu enviar por um cliente em python o xml chega igual e funciona normalmente, mas o flash deve enviar alguma coisa que o socket não reconhece.....

BOM GALERA, ENFIM RESOLVI ESSE GRANDE DESAFIO GRAÇA A AJUDA DE PESSOAS AQUI DO FORUM E DE AMIGOS PROGRAMADORES, MUITO OBRIGADO

VAMOS AS SOLUÇÕES....

PRIMEIRO O CÓDIGO:



import socket
import thread
from twisted.web import microdom

HOST = '' # Endereco IP do Servidor
PORT = 5000 # Porta que o Servidor esta

tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
orig = (HOST, PORT)
tcp.bind(orig)
tcp.listen(999)

def conectado(con, cliente):
print 'Conectado por', cliente

while True:
msg = con.recv(1024)

x = microdom.parseString(msg)
nos = x.documentElement

varChegou = nos.childNodes[0].childNodes[0].data

print 'dataNo: ' + varChegou

if varChegou == "ok":
msgEnvia = "<teste>"
msgEnvia += "<noh>Teste01</noh>"
msgEnvia += "</teste>"
con.send(msgEnvia + '\')
print 'ok'
else:
msgEnvia = "<teste>"
msgEnvia += "<noh>Teste02</noh>"
msgEnvia += "</teste>"
con.send(msgEnvia + '\')
print 'nada ok'

print 'Finalizando conexao do cliente', cliente
con.close()
thread.exit()

while True:
con, cliente = tcp.accept()
thread.start_new_thread(conectado, tuple([con, cliente]))

tcp.close()

[/codebox]

Bom se você leu todo esse tópico você vai entender o c;odigo acima, meu último problema foi resolvido com um modulo do script twisted para python, que você pode encontrar o download e documentação em: http://twistedmatrix.com/trac/

Parece que o xml parse nativo do python tem alguma coisa que não faz receber o xml corretamente do flash, e incrivelmente se você dá print nos nós que chega do xml estão todos lá, mas no parse ele não funciona falando que a formatação está ruim mesmo estando certa.

Então utilizando o oarse do twisted tudo funcionou normalmente.

Ainda vou fazer um tuto melhor para colocar aqui no forum, dúvidas e novidades colocarei aqui, QUALQUER COISA SÓ ENTRAR EM CONTATO...

Até o próximo desafio....

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...