1 | ||
Editor: pycz
Time: 2006/08/16 13:45:30 GMT+0 |
||
Note: |
changed: - *Výtah z konference. Pozn. chtělo by to ještě k tomu nějakou teorii.* 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='localhost' 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ě.
Výtah z konference. Pozn. chtělo by to ještě k tomu nějakou teorii.
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='localhost' 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ě.