2012-11-05 22 views
5

से केवल एक बाइट प्राप्त करना मैंने पायथन का उपयोग कर एक सर्वर प्रोग्राम को कोड किया।सॉकेट

मैं एक स्ट्रिंग प्राप्त करने के लिए कोशिश कर रहा हूँ, लेकिन मैं केवल एक चरित्र मिल गया है! मैं एक स्ट्रिंग कैसे प्राप्त कर सकता हूं?

def handleclient(connection):           
    while True:        
     rec = connection.recv(200) 
     if rec == "help": #when I put help in the client program, rec = 'h' and not to "help" 
      connection.send("Help Menu!") 


    connection.send(rec) 
    connection.close() 

def main(): 
    while True: 
     connection, addr = sckobj.accept() 
     connection.send("Hello\n\r") 
     connection.send("Message: ") 
     IpClient = addr[0] 
     print 'Server was connected by :',IpClient 


     thread.start_new(handleclient, (connection,)) 
+1

आप गैर-अवरुद्ध सॉकेट का उपयोग कर रहे:

इस प्रकार से आपका सर्वर देख सकता का एक उदाहरण है? – cdarke

उत्तर

5

टीसीपी/आईपी कनेक्शन के साथ आपका संदेश खंडित किया जा सकता है। यह एक समय में एक पत्र भेज सकता है, या यह एक ही समय में पूरी तरह से भेज सकता है - आप कभी भी सुनिश्चित नहीं हो सकते हैं।

आपका कार्यक्रमों इस विखंडन को संभालने में सक्षम होने की जरूरत है। या तो एक निश्चित लंबाई पैकेट का उपयोग करें (इसलिए आप हमेशा एक्स बाइट्स पढ़ते हैं) या प्रत्येक पैकेट की शुरुआत में डेटा की लंबाई भेजें। यदि आप केवल ASCII अक्षरों को भेज रहे हैं, तो आप ट्रांसमिशन के अंत को चिह्नित करने के लिए एक विशिष्ट वर्ण (जैसे \n) का भी उपयोग कर सकते हैं। इस मामले में आप तब तक पढ़ेंगे जब तक कि संदेश में \n शामिल न हो।

recv(200) 200 बाइट्स प्राप्त करने के लिए गारंटी नहीं है - सिर्फ 200 अधिकतम है।

rec = "" 
while True: 
    rec += connection.recv(1024) 
    rec_end = rec.find('\n') 
    if rec_end != -1: 
     data = rec[:rec_end] 

     # Do whatever you want with data here 

     rec = rec[rec_end+1:] 
+0

इसलिए मुझे एक लूप बनाना होगा जो जांच करेगा कि क्या डेटा मैं बराबर प्राप्त करता हूं \ n फिर "सहायता" के लिए चेक जांचें। – programmer

+0

जैसा कि मैंने कहा था, आप इसे कुछ तरीकों से कर सकते हैं। यदि आपके संदेश में कभी भी \ n' नहीं होगा तो आप इसे टर्मिनेटर के रूप में उपयोग कर सकते हैं। इसे क्लाइंट में अपने संदेश के अंत में भेजें, और जब तक आप '\ n' नहीं देखते हैं तब तक सर्वर डेटा को पढ़े। मैंने अपने जवाब में कुछ त्वरित नमूना कोड जोड़ा। – Tim