سؤال

أنا جديدة على الثعبان (لقد كنت البرمجة في جافا لعدة سنوات حتى الآن على الرغم من) ، و أنا أعمل على مأخذ بسيط على أساس تطبيق الشبكات (للمتعة فقط).الفكرة هي أن قانون بلدي يربط إلى جهاز التحكم عن بعد TCP نقطة النهاية ثم يستمع أي بيانات يتم دفعها من الخادم إلى العميل ، وأداء بعض تحليل على هذا.

البيانات التي يتم دفعها من سيرفر -> العميل هو UTF-8 ترميز النص, و كل سطر هو محدد من قبل CRLF (\x0D\x0A).ربما خمنت:الفكرة هي أن يتصل العميل إلى الملقم (حتى إلغاؤها من قبل المستخدم) ، ثم يقرأ ثم يوزع خطوط كما أنها تأتي.

لقد تمكنت من الحصول على هذا العمل, ومع ذلك, أنا لست متأكدا من أن أفعل هذا تماما على الطريق الصحيح.لذلك ومن ثم بلدي الأسئلة الفعلية (رمز إلى متابعة):

  1. هل هذا هو الطريق الصحيح للقيام بذلك في بيثون (ie.هل هو حقا بهذه البساطة)?
  2. أي نصائح/الحيل/الموارد المفيدة (وبصرف النظر عن الوثائق المرجعية) فيما يتعلق مخازن/asyncore?

حاليا يتم قراءة بيانات و مخزنة على النحو التالي:

def handle_read(self):
    self.ibuffer = b""

    while True:
        self.ibuffer += self.recv(self.buffer_size)
        if ByteUtils.ends_with_crlf(self.ibuffer):
            self.logger.debug("Got full line including CRLF")
            break
        else:
            self.logger.debug("Buffer not full yet (%s)", self.ibuffer)

    self.logger.debug("Filled up the buffer with line")
    print(str(self.ibuffer, encoding="UTF-8"))

على ByteUtils.ends_with_crlf وظيفة ببساطة الشيكات الماضيين بايت العازلة \x0D\x0A.السؤال الأول هو الرئيسي (الجواب بناء على هذا), ولكن أي أفكار أخرى/نصائح هي موضع تقدير.شكرا

هل كانت مفيدة؟

المحلول

TCP هو تيار و أنت لا يضمن أن المخزن المؤقت الخاص بك لا تحتوي على نهاية رسالة واحدة و بداية القرن المقبل.حتى أتحقق في نهاية المخزن المؤقت لا يعمل كما هو متوقع في جميع الحالات.لديك للتحقق من كل بايت في تيار.

و أنا سوف نوصي بشدة أن تستخدم الملتوية بدلا من asyncore.شيء من هذا القبيل (من الذاكرة, قد لا تعمل من خارج منطقة الجزاء):

from twisted.internet import reactor, protocol
from twisted.protocols.basic import LineReceiver


class MyHandler(LineReceiver):

    def lineReceived(self, line):
        print "Got line:", line


f = protocol.ClientFactory()
f.protocol = MyHandler
reactor.connectTCP("127.0.0.1", 4711, f)
reactor.run()

نصائح أخرى

الأمر أبسط من ذلك .. انظر asynchat و set_terminator طريقة (وغيرها مفيدة الحكايات في ذلك وحدة نمطية). الملتوية هي أوامر من حجم أكثر ثراء وأكثر قوة ، ولكن بما فيه الكفاية المهام البسيطة ، asyncore و asynchat (التي صممت للتعامل بسلاسة) هي في الواقع بسيط جدا للاستخدام, كما كنت قد بدأت مراقبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top