Klient-Server-programmering i python?

Her er kildekoden til multithreaed server og klient i python.

I koden klient og server lukker forbindelsen, efter at opgaven er færdig.
Jeg ønsker at holde forbindelser i live og sende mere data via samme forbindelse til undgå spild af at lukke og åbne stik, hver gang.

Følgende kode er fra : http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/

import pickle
import socket
import threading

# We'll pickle a list of numbers:
someList = [ 1, 2, 7, 9, 0 ]
pickledList = pickle.dumps ( someList )

# Our thread class:
class ClientThread ( threading.Thread ):

   # Override Thread's __init__ method to accept the parameters needed:
   def __init__ ( self, channel, details ):

      self.channel = channel
      self.details = details
      threading.Thread.__init__ ( self )

   def run ( self ):

      print 'Received connection:', self.details [ 0 ]
      self.channel.send ( pickledList )
      for x in xrange ( 10 ):
         print self.channel.recv ( 1024 )
      self.channel.close()
      print 'Closed connection:', self.details [ 0 ]

# Set up the server:
server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
server.bind ( ( '', 2727 ) )
server.listen ( 5 )

# Have the server serve "forever":
while True:
   channel, details = server.accept()
   ClientThread ( channel, details ).start()

import pickle
import socket
import threading

# Here's our thread:
class ConnectionThread ( threading.Thread ):

   def run ( self ):

      # Connect to the server:
      client = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
      client.connect ( ( 'localhost', 2727 ) )

      # Retrieve and unpickle the list object:
      print pickle.loads ( client.recv ( 1024 ) )

      # Send some messages:
      for x in xrange ( 10 ):
         client.send ( 'Hey. ' + str ( x ) + '\n' )

      # Close the connection
      client.close()

# Let's spawn a few threads:
for x in xrange ( 5 ):
   ConnectionThread().start()

OriginalForfatteren Pratik Deoghare | 2009-01-28

3 svar

  1. 20

    Gyde en ny tråd for hver forbindelse er en virkelig dårlig design valg.
    Hvad sker der, hvis du bliver ramt af en masse forbindelser?

    I virkeligheden, ved hjælp af tråde til at vente på nettet IO er ikke det værd. Dit program bliver virkelig kompliceret, og du får helt ingen fordel, da der venter på nettet, i tråde vil ikke gøre dig vente hurtigere. Du kan kun tabe ved hjælp af tråde i dette tilfælde.

    Følgende tekst er fra python dokumentation:

    Der er kun to måder at have en
    programmet på en enkelt processor gøre “mere
    end én ting ad gangen.”
    Multi-threaded programmering, er det
    enkleste og mest populære måde at gøre
    det, men der er en anden meget
    anden teknik, der giver dig mulighed for
    har næsten alle fordelene ved
    multi-threading, uden rent faktisk at
    brug af flere tråde. Det er virkelig
    kun praktisk, hvis dit program er
    i høj grad I/O bundet. Hvis dit program er
    processor bundet, derefter pre-emptive
    planlagt tråde er sandsynligvis, hvad
    du virkelig har brug for. Netværksservere
    sjældent processor bundet, dog.

    Og hvis det er en processor, der er bundet server sag. du kan altid forlade en anden proces/tråd til at gøre processoren del. Du fortsætter:

    Hvis dit operativsystem understøtter
    vælg systemet opkald i/O-bibliotek
    (og næsten alle gør), så du kan bruge
    det at jonglere med flere meddelelse
    kanaler på én gang; for at gøre andet arbejde
    mens din i/O, der finder sted i
    “baggrunden.” Selv om denne strategi
    det kan synes mærkelig og kompleks,
    især i første omgang er det i mange
    måder, nemmere at forstå og kontrol
    end multi-threaded programmering.

    Så i stedet for at bruge tråde, brug af ikke-blokerende input/output: saml stikkene i en liste og bruge en event loop med vælg.vælg at vide, hvilken socket har data til at læse. At gøre det i en enkelt tråd.

    Du kunne vælge en python asynkrone netværk ramme som twisted til at gøre det for dig. Der vil spare dig for en masse hovedpine. Twisted ‘ s kode er blevet forbedret for år, og dækker nogle hjørne tilfælde vil du tage tid at mestre.

    REDIGERE: Alle eksisterende async IO-biblioteker (som Snoet) er python-kode. Du kunne have skrevet det selv, men det er allerede blevet skrevet til dig. Jeg kan ikke se, hvorfor ville du ikke bruger et af disse biblioteker, og skrive din egen værste kode i stedet, da du er en nybegynder. Networing IO er svært at få ret.

    Hvordan til at gøre asynkrone netværk uden brug af snoet eller ethvert andet bibliotek ? Venligst foreslå.
    Jeg vidste bare så i 3. afsnit af mit spørgsmål.
    Du kan ikke gøre noget uden at bruge biblioteker. Alt er et bibliotek. Fra et vist synspunkt, python i sig selv er et bibliotek. Du kan altid kopiere dele eller hele twisted-kode i din applikation, og lade som om du skrev det. Snoet er ren python.
    med andre ord, snoet er den kode, du kunne have skrevet selv. Kun det allerede er blevet skrevet til dig. Jeg kan ikke se hvorfor du ikke ville bruge det (eller et andet bibliotek for async IO) og skrive din egen værste – koden i stedet for.
    Tak for forslag, men er der ikke nogen meget simpelt eksempel for at forstå, hvordan faktisk synkronisering lige n/w virker i python.

    OriginalForfatteren nosklo

  2. 3

    Jeg er ikke sikker på, jeg forstår spørgsmålet, men du behøver ikke kalde close() hvis du ikke ønsker at afbryde forbindelsen…

    OriginalForfatteren sth

  3. 0

    For et eksempel på en klient, der holder en TCP-forbindelse, åbne og bruger en velkendt protokol,
    kig på kilde af telnetlib modul. (undskyld, er der nogen, ellers bliver nødt til at besvare dine threading spørgsmål.)

    Et eksempel på en server, der holder en TCP-forbindelse open er i kilden til SocketServer modul (ethvert standard Python-installation indeholder kildekoden).

    OriginalForfatteren gimel

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *