मैं चयन() के आधार पर रीट्रान्समिशन के लिए टाइमर के उपयोग की जांच करने के लिए एक मूल क्लाइंट/सर्वर इको प्रोग्राम लिखने की कोशिश कर रहा हूं (हालांकि मुझे डीबगिंग को सरल बनाने के लिए उस बिट को टिप्पणी करना पड़ा जब यह इरादे के रूप में काम नहीं कर रहा था)। यहाँ प्रासंगिक कोड के स्निपेट होते:पायथन यूडीपी क्लाइंट/सर्वर प्रोग्राम, समस्याएं
सर्वर:
from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)
while(1):
print "Listening"
recv_data, addr = server_socket.recvfrom(2048)
print recv_data
if recv_data == "Request 1" :
print "Received request 1"
server_socket.sendto("Response 1", address)
elif recv_data == "Request 2" :
print "Received request 2"
data = "Response 2"
server_socket.sendto(data, address)
ग्राहक:
from socket import *
import sys
import select
address = ('localhost', 6005)
client_socket = socket(AF_INET, SOCK_DGRAM)
num_retransmits = 0
while(num_retransmits < 60):
num_retransmits = num_retransmits + 1
data = "Request 1"
client_socket.sendto(data, address)
print "Sending request 1"
recv_data, addr = client_socket.recvfrom(2048)
print recv_data, "!!"
ग्राहक पर उत्पादन बस के अनुरोध भेजा जा रहा है 1 'है, और जब एक ब्रेकप्वाइंट पर प्रयोग किया जाता है रिकॉर्फ़ॉम कॉल पर या नीचे कुछ भी, यह ब्रेकपॉइंट तक नहीं पहुंचता है। इसलिए मुझे लगता है कि क्लाइंट कुछ भी प्राप्त नहीं कर रहा है और यह कर रहा है। दूसरी ओर, सर्वर पर उत्पादन होता है:
- अनुरोध 1
- प्राप्त अनुरोध 1
- सुनकर पर और इतने
- रिस्पांस 1
और इतने सुनकर आगे
पहले लूप के बाद, सर्वर फिर से लूप करता है और पी प्रतिक्रिया का जवाब देता है 1. इसका मतलब है कि सर्वर ने अनुरोध 1 प्राप्त करने के लिए क्या किया था, क्लाइंट को प्रतिक्रिया 1 भेजें, लूप ... लेकिन इसके बाद दूसरी बार लूप्स, प्रतिक्रिया 1 अपनी सॉकेट में अभी भी है! यही कारण है कि जब यह recv_data प्रिंट करता है, तो यह प्रतिक्रिया 1 प्रिंट करता है। दूसरी ओर, क्लाइंट recv_data प्रिंट नहीं कर रहा है, क्योंकि क्लाइंट को यह प्राप्त नहीं हुआ है - यह अभी भी सर्वर की सॉकेट के बफर में है।
कृपया मदद करें - मैंने अन्य गूंज कार्यक्रमों को देखने की कोशिश की है, लेकिन वे सभी टीसीपी का उपयोग करने लगते हैं और काफी सरल हैं (और मुझे लगता है कि मैंने काफी कदम उठाए हैं)। मुझे नहीं पता कि मेरा यूडीपी कार्यक्रम क्यों काम नहीं कर रहा है। मैंने sendall() कॉल को देखने की कोशिश की लेकिन यह केवल टीसीपी के लिए काम करता प्रतीत होता है।
धन्यवाद! किसी कारण से यह पोस्ट दिखाई नहीं दे रहा था: एस लेकिन हाँ, यह तय है – misaochan