2010-08-05 8 views
0

je suis arrivé ce code de http://www.evolt.org/node/60276 et modifié pour écouter un seul « 1 » venant de l'autre côtéprogramme de mise en réseau tombe en panne

mais chaque fois que je lance ce programme, il arrête et IDLE python va non répondre sur " data1, adr = UDPSock.recvfrom (1024) »

def get1(): 
# Server program, receives 1 if ball found 
# ff1 is file w/ received data 

import socket 
import time 

# Set the socket parameters 
host = "mysystem" 
port = 21567 
#buf = 1024 
addr = (host,port) 

# Create socket (UDP) and bind to address 
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
UDPSock.bind(addr) 

# Receive messages 
while 1: 
      print "waiting..............." 
      data1,addr = UDPSock.recvfrom(1024) 
      print "got 1" 
      if not data1: 
       print "Client has exited!" 
       break 
      else: 
       print "\nReceived message '", data1,"'" 
       UDPSock.close() # Close socket 
       print "socket closed\n" 
       #call some other function that uses 1 

et côté client

def send1(): 
# Client program, sends 1 if ball found 
# mf1 is file with data to be sent 

import socket 

# Set the socket parameters 
host = "mysystem" 
port = 21567 
buf = 1024 
addr = (host,port) 

# Create socket (UDP) 
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

mf1=1 
print mf1 

# Send messages 
if(UDPSock.sendto(str(mf1),addr)): 
     print "Sending message '",str(mf1),"'....." 

# Close socket 
UDPSock.close() 

personne ne sait ce qui pourrait être la cause de cela? (désolé pour un long post)

+0

La version que vous avez affichée fonctionne assez bien pour que le problème que vous rencontrez n'apparaisse pas pour moi. Si vous avez une version qui ne fonctionne pas, pourquoi ne pas l'afficher à la place de la version qui fonctionne? – Omnifarious

Répondre

0

En guise de seconde supposition (j'ai remplacé ma première estimation par ceci) je suspecte que vous exécutez le récepteur dans IDLE et alors IDLE est suspendu ainsi vous ne pouvez pas exécuter le client. Je ne sais pas exactement comment fonctionne IDLE car je ne l'utilise jamais, mais la ligne contenant recvfrom arrêtera le thread Python son fonctionnement jusqu'à ce que les données sont envoyées. Vous devez donc démarrer le client dans une instance distincte de IDLE ou à partir de la ligne de commande ou de quelque chose. En tout cas, j'ai testé le programme en question sur mon Python avec 127.0.0.1 en tant qu'hôte, et ça a bien fonctionné, pour certaines valeurs de finesse. Le recvfrom se bloque, mais seulement jusqu'à ce que certaines données soient envoyées, puis il revient avec les données et les imprime et tout. Vous avez un bug qui arrive après cela cependant. :-)

+0

c'était une bonne supposition (pas que je connaisse la réponse) mais j'ai déjà essayé et ce n'est pas le problème ... – pjehyun

+0

@pjehyun - J'ai testé ce code moi-même, et il a un bug mais fonctionne largement pour un message. Courez-vous le côté client pendant que IDLE est suspendu? – Omnifarious

+0

J'ai deux ordinateurs mis en place et exécutez get1() sur un puis send1() sur l'autre. get1() s'étouffe dès qu'il touche cette ligne. Est-ce que ça répond à votre question? Je ne suis pas sûr – pjehyun

Questions connexes