simple chat server

Thomas Jollans thomas at jollans.com
Sat Jun 12 17:10:19 EDT 2010


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()".

> 




More information about the Python-list mailing list