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




subject:
  ( 112 subscribers )