Prisijungti

laikinas serveris

  • 16 Bal '10

Sveiki, reiktu patarimu tokiu klausimu, as turiu serveryje priimti ateinancia informacija, paleidus programa serveris budi ir laukia kol sulauks pirmo duomens tuomet pradeda juos fiksuoti ir priimineti. Duomenys ateina nenutrukstamu srautu, tarp duomenu milisekundziu tarpai. Kaip padaryti serveri taip jog, jis priima duomenis, bet vos tik duomenu nera kelias sekundes jis atsijungia ir programa tesiasi toliau.dabartinis serveris yra toks:

s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
s.bind( ( HOST, PORT ) )
if s.recvfrom(1500)
f = open('C:\Documents and Settings\UserXP\Desktop\3GUpL.txt', 'a')
while True:
    packet,address=s.recvfrom(1500)
    f.write(...)
f.close()
s.close()
toliau tesiami kiti darbai

Viskas berods vyksta gerai, priimami duomenys vos tik gautas pirmas, ir viskas yra surenkama kol klientas siuncia, bet kai tik siuntimas nustoja, programa kimba ant packet, address+s.recvfrom(1500) ir laukia kito yraso, kaip padaryti kad to nebutu ir nesulaukes duomenu kelias sekundes serveris nebelauktu ir butu pereita prie kitu darbu?Aciu

  • 16 Bal '10

Šiais laikais rašant server/client programas geriausia naudoti twisted. Tai siūlau juo pasidomėti.

  • 16 Bal '10

Štai pavyzdys su twisted. Iš pradžių laukiama kol atkeliaus duomenys, kai duomenys atkeliauja įjungiamas laikmatis, kuris kas dvi sekundes tikrina ar duomenys vis dar eina, jei duomenų srautas 2 sekundžių bėgyje baigiasi, tada nutraukiamas ir serverio darbas.

#!/usr/bin/env  python

from twisted.internet import task
from twisted.internet import reactor, protocol

class MyServer(protocol.Protocol):

    started = False
    received = False

    def dataReceived(self, data):
        self.received = True
        if not self.started:
            self.started = True
            self.timer = task.LoopingCall(self.checkTimeout)
            self.timer.start(2.0)

        print(data)

    def checkTimeout(self):
        if not self.received:
            reactor.stop()

        self.received = False

def main():
    factory = protocol.ServerFactory()
    factory.protocol = MyServer
    reactor.listenTCP(8000, factory)
    reactor.run()

if __name__ == '__main__':
    main()

Kodą patikrinti galima su netcat, viename terminalo lange paleidus serverį, kitame prijungus su netcat localhost 8000 ir ranka įvedinėjant duomenis. Jei per 2 sekundes nieko nebus įvesta, serveris nutrauks darbą.

Atsakyti