문제

저는 Python을 처음 접했으며 (지금은 몇 년 동안 Java로 프로그래밍 해 왔으며) 간단한 소켓 기반 네트워킹 응용 프로그램 (재미를 위해) 작업 중입니다. 아이디어는 내 코드가 원격 TCP 엔드 포인트에 연결 한 다음 서버에서 클라이언트로 푸시되는 데이터에 대해 글을 듣고 일부 파싱을 수행한다는 것입니다.

서버에서 푸시되는 데이터는 UTF -8 인코딩 된 텍스트이며 각 줄은 CRLF (\x0D\x0A). 아마도 당신은 아마 추측했을 것입니다 : 아이디어는 클라이언트가 서버에 연결한다는 것입니다 (사용자가 취소 할 때까지). 그런 다음 선을 읽고 읽는 줄을 읽고 구문 분석합니다.

나는 이것을 작동시킬 수 있었지만, 나는 이것을 올바른 방법으로하고 있는지 확실하지 않습니다. 따라서 내 실제 질문 (따라야 할 코드) :

  1. 이것이 파이썬에서 그것을하는 올바른 방법입니까 (예 : 정말 간단합니까)?
  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는 스트림이며 버퍼에 하나의 메시지의 끝과 다음 메시지의 시작이 포함되어 있지 않다는 보장되지 않습니다. 따라서 버퍼 끝에서 n r을 확인하는 것이 모든 상황에서 예상대로 작동하지 않습니다. 스트림의 각 바이트를 확인해야합니다.

그리고 나는 당신이 비동기 대신 트위스트를 사용하는 것이 좋습니다. 이와 같은 것 (메모리에서 상자에서 작동하지 않을 수 있음) :

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()

다른 팁

더 간단합니다 비동기 그리고 그것 set_terminator 방법 (및 해당 모듈의 기타 유용한 Tidbits). 꼬인 규모가 더 풍부하고 강력하지만, 충분히 간단한 작업을 위해서는 Asyncore와 Asynchat (원활하게 상호 작용하도록 설계된)은 관찰을 시작했을 때 실제로 사용하기가 매우 간단합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top