2015-06-14 98 views
0

我有一個正在監聽套接字的python腳本。
代碼看起來是這樣的:Python不會比較字符串

def clientthread(conn): 
     while True: 
       data = conn.recv(1024) 
       if data == 'quit': 

我連接到使用telnet服務器。當我發送退出時,「if data =='之後的代碼退出」:「不執行。哪裏不對?

+0

'conn.recv'返回一個'bytes'對象,而不是一個字符串。 –

+1

此外,您可能正在鍵入一個回車符和/或換行符,這也將被髮送,(最多1024個字符)。更好地打印(repr(數據))以查看您真正收到的內容。 – swstephe

+0

你使用Python 2.X還是3.X? – s16h

回答

1

如果您刪除換行符,最有可能的情況是大多數情況下都會起作用。

但是:如果您想獲得任何可靠性,您不能僅僅接受recv的輸出並將其與命令進行比較。操作系統可能會以任何想要的方式將數據拆分成更多或更少的部分。所以你可以分別獲得'qu'和'it \ n'。你真的需要緩存recv的返回值,並使用例如startswith來匹配下一個命令並刪除執行的命令。

而且上校三十二個在評論說,如果你是期運用Python 3.x都有他們是字節串,所以你需要比較的字節串爲B「跳槽」

1

試圖通過將其轉換爲一個strdata.decode("utf-8")。目前它是一個bytes對象。

+0

你是個好人。您已解決我的問題,謝謝! –

0

如果你正在使用Python 2.X,然後,在比較之前或許剝離接收到的數據,這將有助於:

def clientthread(conn): 
    while True: 
     data = conn.recv(1024) 
     if data.strip() == 'quit': 

如果你正在使用Python 3.X,那麼socket.recv()返回值是一個表示接收到的數據的字節對象。因此,在進行比較之前,您應該將其轉換爲字符串:

def clientthread(conn): 
    while True: 
     data = conn.recv(1024) 
     if data.decode('UTF-8').strip() == 'quit': 

如果以上都不幫助您,請告訴我。