On 06/11/2010 12:26 AM, Burakk wrote: > Hi, > > I am using ubuntu lucid and i have started to learn python(vrs 3.1). I > am trying to make a tutorial code(see below) work but when i run the > code, open a terminal window and connect as client with telnet and > type somethings and hit enter, give me error below...(the terminal > says connection closed by foreign host) > > if someone can help i will be glad... > > thanx > > -- error: uncaptured python exception, closing channel > <__main__.ChatSession connected 127.0.0.1:46654 at 0xb71cce8c> (<class > 'TypeError'>:expected an object with the buffer interface [/usr/lib/ > python3.1/asyncore.py|read|75] [/usr/lib/python3.1/asyncore.py| > handle_read_event|420] [/usr/lib/python3.1/asynchat.py|handle_read| > 170]) -- >
my guess is that you can't use (unicode) strings as network data. You'd have to use byte strings most of the time. (only a guess) This code was probably written with Python 2 in mind. See below > code > > from asyncore import dispatcher > from asynchat import async_chat > import asyncore > import socket > > PORT = 5005 > NAME = 'TestChat' > > class ChatSession(async_chat): > > def __init__(self, sock): > async_chat.__init__(self, sock) > self.set_terminator("xx") replace that with b"xx" > self.data = [] > > > def collect_incoming_data(self, data): > self.data.append(data) > > > def found_terminator(self): > line = ''.join(self.data) use b''.join(self.data) > self.data = [] > self.push(line) > > class ChatServer(dispatcher): > def __init__(self, port): > dispatcher.__init__(self) > self.create_socket(socket.AF_INET, socket.SOCK_STREAM) > self.set_reuse_addr() > self.bind(('', PORT)) > self.listen(5) > self.sessions = [] > > > def handle_accept(self): > conn, addr = self.accept() > self.sessions.append(ChatSession(conn)) > > if __name__== '__main__': > s = ChatServer(PORT) > try: asyncore.loop() > except KeyboardInterrupt : print This won't do anything: print is now a function, not a statement. Use print() instead. Also, that's silly. If you want to ignore keyboard interrupts (I don't think that's a good idea), use "pass" instead of "print()". > -- http://mail.python.org/mailman/listinfo/python-list