2012-08-02 21 views
16

मैं अजगर में एक साधारण ग्राहक & सर्वर संदेश कार्यक्रम बनाने के लिए कोशिश कर रहा हूँ, और मैं त्रुटि "लेखन त्रुटि: 'str' बफर इंटरफ़ेस का समर्थन नहीं करता" बार आ रही है और नहीं है वास्तव में यह भी पता है कि इसका क्या अर्थ है। मैं अधिकांश भाग के लिए अजगर के साथ शुरुआत कर रहा हूं, और नेटवर्किंग के साथ एक पूर्ण भिखारी हूं।लेखन त्रुटि: str बफर इंटरफ़ेस का समर्थन नहीं करता

मैं किसी कारण मैं स्ट्रिंग डेटा नहीं भेज सकते हैं के लिए यह सोचते हैं रहा हूँ? यदि यह मामला है, तो मैं एक स्ट्रिंग कैसे भेजूं?

संदर्भ के लिए, उदाहरण कोड मुझे इनमें से अधिकतर पाइथन 2.x के लिए मिला था, और मैं इसे पायथन 3 में कर रहा हूं, इसलिए मेरा मानना ​​है कि यह संस्करण संक्रमण से बाहर काम करने के लिए एक और कंक है। मैंने एक ही समस्या के लिए चारों ओर खोज की है, लेकिन वास्तव में यह नहीं कर सकता कि मेरी स्थिति में एक ही फिक्स को कैसे लागू किया जाए।

यहाँ सर्वर के लिए शुरुआत कोड है:

import socket 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.bind(("", 5000)) 
server_socket.listen(5) 

print("TCP Server Waiting for client on port 5000") 

while 1: 
    client_socket, address = server_socket.accept() 
    print("TCP Server received connect from: " + str(address)) 
    while 1: 
     data = input("SEND(Type q or Q to quit):") 
     if(data == 'Q' or data == 'q'): 
      client_socket.send(data) 
      client_socket.close() 
      break; 
     else: 
      client_socket.send(data) 
      data = client_socket.recv(512) 

     if(data == 'q' or data == 'Q'): 
      client_socket.close() 
      break; 
     else: 
      print("Received: " + data) 
+2

[' StringIO.StringIO (डेटा) '] भेजने का प्रयास करें। –

+1

एक तरफ ध्यान दें के रूप में: इस प्रकार आप अपनी अगर-बयानों को आसान बनाने में कर सकते हैं 'अगर ('क्यू', 'क्यू') में डेटा:' – gsk

+2

@gsk: या 'अगर data.lower() ==" q ":' । –

उत्तर

54

अजगर 3 में, बाइट्स तार और यूनिकोड तार अब दो अलग अलग प्रकार के होते हैं। चूंकि सॉकेट स्ट्रिंग एन्कोडिंग से अवगत नहीं हैं, इसलिए वे कच्चे बाइट स्ट्रिंग का उपयोग कर रहे हैं, जिनके पास यूनिकोड तारों से थोड़ा अलग इंटरफ़ेस है।

तो, अब, जब भी आप एक यूनिकोड स्ट्रिंग है कि आप एक बाइट स्ट्रिंग के रूप में उपयोग करने की आवश्यकता है, तो आप यह encode() की जरूरत है। और जब आपके पास बाइट स्ट्रिंग है, तो आपको इसे नियमित (पायथन 2.x) स्ट्रिंग के रूप में उपयोग करने के लिए decode की आवश्यकता होती है।

यूनिकोड तार संलग्न तार उद्धरण हैं। बाइट्स स्ट्रिंग्स b"" संलग्न तार

What's new in python 3.0 देखें। (Http://docs.python.org/library/stringio.html) सिर्फ `डेटा` के बजाय

+2

क्या आप मुझे थोड़ा और जानकारी दे सकते हैं? एन्कोड (डेटा) पायथन द्वारा पहचाना नहीं गया है, और यदि मैं str.encode (डेटा) – Morgan

+13

का उपयोग करता हूं तो मुझे अभी भी वही त्रुटि मिलती है जब आप 'client_socket.send (डेटा)' का उपयोग करते हैं, तो इसे 'client_socket.send (डेटा। एनकोड()) '। जब आप 'data = client_socket.recv (512)' का उपयोग कर डेटा प्राप्त करते हैं, तो इसे 'data = client_socket.recv (512) .decode()' से बदलें और आपको ठीक होना चाहिए – Scharron

+0

आपको बहुत धन्यवाद! आपने नेटवर्किंग प्रोग्रामिंग में अपने पहले प्रयास में मेरी मदद की है। – Morgan

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