import
multiprocessing
import
socket
def
handle
(
connection
,
address
):
import
logging
logging
.
basicConfig
(
level
=
logging
.
DEBUG
)
logger
=
logging
.
getLogger
(
"process-
%r
"
%
(
address
,))
try
:
logger
.
debug
(
"Connected
%r
at
%r
"
,
connection
,
address
)
while
True
:
data
=
connection
.
recv
(
1024
)
if
data
==
""
:
logger
.
debug
(
"Socket closed remotely"
)
break
logger
.
debug
(
"Received data
%r
"
,
data
)
connection
.
sendall
(
data
)
logger
.
debug
(
"Sent data"
)
except
:
logger
.
exception
(
"Problem handling request"
)
finally
:
logger
.
debug
(
"Closing socket"
)
connection
.
close
()
class
Server
(
object
):
def
__init__
(
self
,
hostname
,
port
):
import
logging
self
.
logger
=
logging
.
getLogger
(
"server"
)
self
.
hostname
=
hostname
self
.
port
=
port
def
start
(
self
):
self
.
logger
.
debug
(
"listening"
)
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_STREAM
)
self
.
socket
.
bind
((
self
.
hostname
,
self
.
port
))
self
.
socket
.
listen
(
1
)
while
True
:
conn
,
address
=
self
.
socket
.
accept
()
self
.
logger
.
debug
(
"Got connection"
)
process
=
multiprocessing
.
Process
(
target
=
handle
,
args
=
(
conn
,
address
))
process
.
daemon
=
True
process
.
start
()
self
.
logger
.
debug
(
"Started process
%r
"
,
process
)
if
__name__
==
"__main__"
:
import
logging
logging
.
basicConfig
(
level
=
logging
.
DEBUG
)
server
=
Server
(
"0.0.0.0"
,
9000
)
try
:
logging
.
info
(
"Listening"
)
server
.
start
()
except
:
logging
.
exception
(
"Unexpected exception"
)
finally
:
logging
.
info
(
"Shutting down"
)
for
process
in
multiprocessing
.
active_children
():
logging
.
info
(
"Shutting down process
%r
"
,
process
)
process
.
terminate
()
process
.
join
()
logging
.
info
(
"All done"
)