[Tutor PyCZ] vytvoření serveru
slacker
slacker na inmail.cz
Středa Srpen 16 00:09:18 CEST 2006
Zdravím,
tady je něco jako koncept klient-server aplikace, která používá TCP
(omlouvám se za délku, ale myslím že mít funkční příklad je lepší
než nějaké útržky kódu):
=== server.py ===
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import thread
import time
import message
LOCALHOST=''
DEFAULT_PORT=43210
def clientHandler(dataSocket):
try:
while 1:
data = message.receiveMessage(dataSocket)
print '\n\nmessage:', data
rdata = ''.join(list(reversed(data)))
time.sleep(2) # pretend we're doing something here...
print 'sending:', rdata
sent = message.sendMessage(dataSocket, rdata)
print 'sent:', sent
except:
pass
def startServer(port):
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.bind((LOCALHOST, port))
serverSocket.listen(1)
while 1:
clientSocket, clientAddress = serverSocket.accept()
print "Accepted connection"
thread.start_new_thread(clientHandler, (clientSocket,))
if __name__ == "__main__":
startServer(DEFAULT_PORT)
=== client.py ===
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import thread
import time
import message
outMsg="hello!"
DEFAULT_PORT=43210
DEFAULT_HOST=''
def client(dataSocket):
while 1:
message.sendMessage(dataSocket, outMsg)
print "\n\nsent:", outMsg
inMsg = message.receiveMessage(dataSocket)
print "received:", inMsg
def mainLoop(hostName, port):
dataSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print 'connecting...'
dataSocket.connect((hostName, port))
print 'starting thread...'
thread.start_new_thread(client, (dataSocket,))
except:
print 'connection failed'
while 1:
print 'something in the main loop...'
time.sleep(3) # do something
if __name__ == '__main__':
import sys
try:
outMsg = sys.argv[1]
except:
pass
mainLoop(DEFAULT_HOST, DEFAULT_PORT)
=== message.py ===
#!/usr/bin/python
# -*- coding: utf-8 -*-
def receiveMessage(dataSocket):
size = int(dataSocket.recv(4))
return dataSocket.recv(size)
def sendMessage(dataSocket, message):
size = len(message)
if size > 9999:
size = 9999
dataSocket.send(str(size).rjust(4))
return dataSocket.send(message[:size])
=================
Upozorňuju, že je to opravdu jenom koncept "jak na to" a sepsal
jsem to celkem narychlo.
Jenom pro úplnost - další možností, tentokráte bez threadů, je použití
select(iwtd, owtd, ewtd[, timeout]) z modulu select. O tom ale snad
někdy příště.
Snad to někomu pomůže.
slacker
Další informace o konferenci Tutor