Socket and cycle problem
Jean-Paul Calderone
exarkun at divmod.com
Mon May 12 15:06:31 EDT 2008
On Mon, 12 May 2008 11:16:08 -0700 (PDT), petr.poupa at gmail.com wrote:
> [snip]
>
>My script send me via 3883 port (VRPN) data, but only once. I need
>listening this port countinously.
>So I need make some loop to print data from 3883 port permanent.
>Data that I recevied looks liek this:
>
>receive data from server: 'vrpn: ver. 07.13 0\x00\xe8\x0b\x00\x00'
I'm not sure if you need to write a server or a client. In your
original code, you had a client which repeatedly established out-
bound connections. Here, you say you need to listen on a port.
>
>Do you think its necessary to use Twisted? Do you have any ideas how
>to do it with socket modul?
The basic version is pretty easy either way. However, with Twisted,
you get cross-platform error handling without any extra effort, and
you don't have to think about the boring low-level details of BSD
sockets.
Here's a Twisted server that listens on port 3883 forever and prints
the data it receives from each connection after the remote side drops
the connection:
from twisted.internet import reactor
from twisted.internet.protocol import ServerFactory, Protocol
class PrintingProtocol(Protocol):
def connectionMade(self):
"""
When the connection is first established, create a list
into which to buffer all received data.
"""
self.received = []
def dataReceived(self, data):
"""
Whenever any data is received on this connection, add it
to the buffer.
"""
self.received.append(data)
def connectionLost(self, reason):
"""
When the connection is lost, print out the contents of
the receive buffer.
"""
print repr("".join(self.received))
# Create a factory which will use our protocol to handle incoming
# connections.
factory = ServerFactory()
factory.protocol = PrintingProtocol
# Listen with it on port 3883
reactor.listenTCP(3883, factory)
# Start the reactor. Nothing in this program will ever stop the
# reactor, so it will run and accept connections forever.
reactor.run()
If you were to use the socket module, then it would look something like this:
from socket import socket
from errno import EINTR
port = socket()
port.bind(('', 3883))
port.listen(5)
while True:
try:
server, clientAddr = port.accept()
except socket.error, e:
print "Error accepting client connection", e
else:
received = []
while True:
try:
bytes = server.recv(1024 * 16)
except socket.error, e:
if e.errno == EINTR:
continue
else:
break
if not bytes:
break
received.append(bytes)
print repr("".join(received))
Hope this helps,
Jean-Paul
More information about the Python-list
mailing list