2010-08-05 106 views
0

我從http://www.evolt.org/node/60276得到這個代碼,並修改它來聽一個「1」,從另一個側面來網絡程序崩潰

但每當我運行這個程序,它停止和Python IDLE去無響應的「數據1,地址= 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 

和客戶端

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() 

沒有人知道什麼可能是這個原因嗎? (對不起,很抱歉)

+0

您發佈的版本效果不錯,您遇到的問題不會顯示給我。如果你的版本不起作用,爲什麼不發佈它,而不是它的版本? – Omnifarious 2010-08-06 01:08:52

回答

0

作爲第二個猜測(我用這個替換了我的第一個猜測)我懷疑你是在IDLE中運行接收器,然後IDLE掛起,所以你不能運行客戶端。我不知道IDLE是如何工作的,因爲我從不使用它,但是包含recvfrom的行將停止它運行的Python線程,直到發送數據。所以你需要在一個獨立的IDLE實例或命令行或其他東西中啓動客戶端。

無論如何,我已經在127.0.0.1作爲主機測試了我的Python中的程序,並且它工作正常,對於一些很好的值。 recvfrom確實掛起,但只有在發送了一些數據之前,它纔會返回數據並將其打印出來。儘管如此,你確實有一個錯誤發生。 :-)

+0

這是一個很好的猜測(不是我知道答案),但我已經嘗試過,這不是問題... – pjehyun 2010-08-06 00:08:31

+0

@pjehyun - 我自己測試了這個代碼,它有一個錯誤,但主要適用於一條消息。你是否在IDLE懸掛時運行客戶端? – Omnifarious 2010-08-06 00:12:26

+0

我有兩臺電腦設置並運行get1​​(),然後發送另一個send1()。 get1()扼流圈只要碰到那一行就行。這是否回答你的問題?即時通訊不知道 – pjehyun 2010-08-06 00:17:39