Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Socket Send Buffer Vs. Str

I am trying to get a basic server (copied from Beginning Python) to send a str.

The error:

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

It seems to work when pickling an object. All of the examples I found, seem to be able to send a string no problem.

Any help would be appreciated,

Stephen

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()
like image 502
BrownFox97 Avatar asked Mar 09 '10 19:03

BrownFox97


2 Answers

It seems you try to use Python 2.x examples in Python 3 and you hit one of the main differences between those Python version.

For Python < 3 'strings' are in fact binary strings and 'unicode objects' are the right text objects (as they can contain any Unicode characters).

In Python 3 unicode strings are the 'regular strings' (str) and byte strings are separate objects.

Low level I/O can be done only with data (byte strings), not text (sequence of characters). For Python 2.x str was also the 'binary data' type. In Python 3 it is not any more and one of the special 'data' objects should be used. Objects are pickled to such byte strings. If you want to enter them manually in code use the "b" prefix (b"XXX" instead of "XXX").

like image 137
Jacek Konieczny Avatar answered Nov 04 '22 23:11

Jacek Konieczny


To add to Jacek Konieczny's answer: You can also use str.encode() to get bytes from a string. If you have the string in a variable instead of a literal, you can call encode and it will return an equivalent series of bytes.

like image 27
A. Levy Avatar answered Nov 04 '22 22:11

A. Levy