2012-07-20 14 views
14

से इनकार कर दिया है मैं सॉकेट का उपयोग करके फ़ाइल स्थानांतरण के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं। कोड का सर्वर अंत ठीक चल रहा है। हालांकि, ग्राहक के पक्ष में मैं निम्न त्रुटि के रूप मेंपायथन सॉकेट। आतंक: [एरर्नो 111] कनेक्शन ने

import os 
import socket 

def transferFile(fname): 
    HOST = '127.0.0.1' 
    CPORT = 36258 
    MPORT = 36250 
    FILE = fname 
    cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    cs.connect((HOST, 36258)) 
    cs.send("SEND " + FILE) 
    cs.close() 
    ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    ms.connect((HOST, MPORT)) 
    f = open(FILE, "rb") 
    data = f.read() 
    f.close() 
    ms.send(data) 
    ms.close() 

def uploadFiles(directory): 
    home = os.getenv("HOME") 
    folder = str(home + "/" + directory) 
    os.chdir(folder) 
    dirList = os.listdir(folder) 
    print dirList 
    for fname in dirList: 
     if fname.endswith('.bin'): 
      transferFile(fname) 

os.chdir(os.getenv("HOME")) 
directory = "testdownload" 
if not os.path.exists(directory): 
    os.makedirs(directory) 
os.chdir(directory) 

uploadFiles(directory) 

मैं और स्टैक ओवरफ़्लो पर अन्य पदों गूगल पर मदद की तलाश करने की कोशिश की इस प्रकार

Traceback (most recent call last): 
File "client.py", line 54, in <module> 
uploadFiles(directory) 
File "client.py", line 36, in uploadFiles 
transferFile(fname) 
File "client.py", line 13, in transferFile  
cs.connect((HOST, 36258)) 
File "/usr/lib/python2.7/socket.py", line 224, in meth 
return getattr(self._sock,name)(*args) 
socket.error: [Errno 111] Connection refused 

मेरे कोड है मिलता है, उनमें से कोई भी मदद की। क्या कोई मेरी सहायता कर सकता है? लाइन संख्याएं अलग-अलग हो सकती हैं क्योंकि मैंने कोड

+0

आप उस सर्वर अंत कैसे पता चलेगा काम कर रहा है? त्रुटि संदेश से पता चलता है कि 127.0.0.1:36258 को टीसीपी कनेक्शन अस्वीकार कर दिया जा रहा है। जब आप 'टेलनेट 127.0.0.1 36258' चलाते हैं तो क्या होता है? –

+0

मैंने 'टेलनेट 127.0.0.1 36258' भाग लिया और कनेक्शन देखने में सक्षम था। '127.0.0.1 कोशिश कर रहा है ...' ' 127.0.0.1.' से कनेक्ट किया गया' भागने चरित्र '^]' मैं सर्वर अंत की जाँच की और पाया सॉकेट खोलने नहीं के साथ कोई समस्या नहीं थी है। ' क्लाइंट साइड के साथ सिंक में धन्यवाद – hld619

+0

उपरोक्त टिप्पणी में जोड़ने के लिए, मैंने 'cs.close()' के बाद और ms.close() 'के बाद 2 सेकंड देरी जोड़ा ताकि सर्वर पर कनेक्शन सिंक हो सके अंत और यह एक आकर्षण की तरह काम किया। धन्यवाद टीसी – hld619

उत्तर

13

समस्या स्पष्ट रूप से थी (जैसा कि आपने इसे समझ लिया था) कि पोर्ट 36250 कनेक्ट करने का प्रयास करते समय सर्वर पक्ष पर खुला नहीं था (इसलिए कनेक्शन से इंकार कर दिया)। मैं देख सकता हूं कि किसी अन्य कनेक्शन पर SEND कमांड प्राप्त करने के बाद सर्वर को इस सॉकेट को खोलना था, लेकिन जाहिर है कि "क्लाइंट साइड के साथ सिंक में इसे खोलना नहीं था"।

ठीक है, मुख्य कारण यह होगा कि कोई सिंक्रनाइज़ेशन नहीं था। कॉलिंग:

cs.send("SEND " + FILE) 
cs.close() 

सिर्फ एक ओएस बफर में डेटा जगह होगा, close शायद डेटा को फ्लश करेगा और नेटवर्क में धक्का देगी, लेकिन डेटा सर्वर तक पहुंचने से पहले यह निश्चित रूप से वापस आ जाएगा। sleepclose के बाद समस्या को कम कर सकता है, लेकिन यह सिंक्रनाइज़ेशन नहीं है।

सही समाधान होगा सुनिश्चित करें कि सर्वर ने कनेक्शन खोला है। इसके लिए आपको कुछ संदेश वापस भेजने की आवश्यकता होगी (उदाहरण के लिए OK, या बेहतर PORT 36250 यह इंगित करने के लिए कि कनेक्ट करना है)। यह सुनिश्चित करेगा कि सर्वर पहले ही सुन रहा है।

दूसरी बात आपको यह सुनिश्चित करने के लिए send के वापसी मूल्यों को देखना होगा ताकि आपके बफर से कितने बाइट्स लिया जा सके। या sendall का उपयोग करें।

(यह देर से जवाब के साथ परेशान करने के लिए क्षमा करें, लेकिन मैं इस पाया एक उच्च यातायात प्रश्न होने के लिए और मैं वास्तव में टिप्पणी अनुभाग में नींद विचार पसंद नहीं आया।)

+0

यह बहुत समय पहले था लेकिन नींद का उपयोग अब मुझे मूर्खतापूर्ण लगता है; वैसे भी, उत्तर के लिए बहुत बहुत धन्यवाद! :) – hld619

संबंधित मुद्दे