Edit detail for ThreadySockety revision 1 of 1

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.

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