From: Burakk on
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]) --

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")
self.data = []


def collect_incoming_data(self, data):
self.data.append(data)


def found_terminator(self):
line = ''.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

From: Peter Pearson on
On Thu, 10 Jun 2010 15:26:28 -0700 (PDT), 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...

I know this is very little help, but your code appears to
work fine under Python 2.5.2.

--
To email me, substitute nowhere->spamcop, invalid->net.
From: Giampaolo Rodolà on
In every dispatcher instance of your application I recommend to
override handle_error as follows:

class A(asyncore.dispatcher)

def handle_error(self):
raise

This will print a common traceback message instead of the compact one
provided by asyncore which provides a lot less information.


--- Giampaolo
http://code.google.com/p/pyftpdlib
http://code.google.com/p/psutil

2010/6/11 Burakk <burak.kuyucakli(a)gmail.com>:
> 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]) --
>
> 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")
>         self.data = []
>
>
>     def collect_incoming_data(self, data):
>         self.data.append(data)
>
>
>     def found_terminator(self):
>         line = ''.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
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
From: Burakk on
Thank you for your replies...

I have overriden the error handlers
and the results:

Traceback (most recent call last):
File "/home/burak/NetBeansProjects/intantMarkup/src/
02basicServer.py", line 65, in <module>
try: asyncore.loop()
File "/usr/lib/python3.1/asyncore.py", line 206, in loop
poll_fun(timeout, map)
File "/usr/lib/python3.1/asyncore.py", line 147, in poll
read(obj)
File "/usr/lib/python3.1/asyncore.py", line 79, in read
obj.handle_error()
File "/usr/lib/python3.1/asyncore.py", line 75, in read
obj.handle_read_event()
File "/usr/lib/python3.1/asyncore.py", line 420, in
handle_read_event
self.handle_read()
File "/usr/lib/python3.1/asynchat.py", line 170, in handle_read
index = self.ac_in_buffer.find(terminator)
TypeError: expected an object with the buffer interface


But i want to add that i am writing the code in netbeans with python
3.1 and running the code from the programme.. Ubuntu deafult python is
2.6.5. Is this a problem. And i also want to add that i made the .py
executable and run that from terminal too with the same
results...
From: Thomas Jollans on
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()".

>