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
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.
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.k...@gmail.com>:
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...
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()".
>