2010-03-09 35 views
9

Bir str göndermek için temel bir sunucu (Beginning Python'dan kopyalanan) almaya çalışıyorum.Python Soket Gönder Tampon Vs. Str

hatası:

c.send("XXX") 
TypeError: must be bytes or buffer, not str 

Bir nesneyi dekapaj zaman iş gibi görünüyor. Bulduğum tüm örnekler, bir dize sorunu yok gibi görünüyor. Herhangi bir yardım mutluluk duyacağız

,

Stephen Size Python 3'te Python 2.x örneklerini kullanmayı deneyin ve bu Python sürümü arasındaki temel farklardan biri isabet görünüyor

import socket 
import pickle 

s = socket.socket() 

host = socket.gethostname() 

port = 80 

s.bind((host, port)) 

s.listen(5) 

while True: 
    c, addr = s.accept() 
    print("Got Connection From ", addr) 
    data = pickle.dumps(c) 
    c.send("XXX") 
    #c.send(data) 
    c.close() 
+7

Python 3.x kullanıyorsanız, '' XXX ''by' b "XXX" 'ile değiştirmeyi deneyin. – jfs

cevap

21

.

Python için < 3 'dizgiler' aslında ikili dizgilerdir ve 'unicode nesneleri' (herhangi bir Unicode karakteri içerebildiğinden) doğru metin nesneleridir.

Python 3'te unicode dizeleri 'normal dizeler' (str) ve bayt dizeleri ayrı nesnelerdir.

Düşük seviye G/Ç, metinle (karakter dizisi) değil, yalnızca veri (bayt dizgileri) ile yapılabilir. Python 2.x için str de 'ikili veri' tipiydi. Python 3'te artık değil ve özel 'veri' nesnelerinden biri kullanılmalıdır. Nesneler, bu bayt dizelerine eklenir. El ile kodda girmek istiyorsanız, "b" önekini kullanın ("XXX" yerine b "XXX").

12

Jacek Konieczny'nin yanıtına eklemek için: Bir dizeden bayt almak için str.encode()'u da kullanabilirsiniz. Bir değişkenin yerine bir değişkendeki dize varsa, kodlamayı çağırabilir ve eşdeğer bir bayt dizisi döndürür.

İlgili konular