| 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ě.