2016-03-01 85 views
1

我剛剛開始使用python進行TCP服務器和客戶端編程。然而的一個if語句不工作,它沒有任何意義:如果聲明被跳過,即使聲明爲真

while (1): 
    data = s.recv(1024) 
    if data == 'finish': 
     break 
    print data 
print 'Finish' 

有時最後通道將在「完成」代替打印「完成」,它不能退出循環。這應該永遠不會發生,因爲如果data ='finish','print data'語句會被跳過。有人能告訴我爲什麼會發生這種情況嗎?

+1

保存自己的頭痛,只是做'data.lower()'如果你正在「完成」不同的腸衣。 – idjaw

+0

,因爲我在服務器端使用c.send('finish'),因此數據不會'完成'。 –

+1

嘗試'打印repr(數據)',而不是看看你到底在收到什麼。可能有一個隱藏的角色。 –

回答

3

剛因爲您在一次調用中將字節發送到send並不意味着您將在一次調用recv時收到它們。他們可能會到達更小或更大的羣體。例如。也許您發送:

c.send('one') 
c.send('two') 
c.send('three') 
c.send('finish') 

但您會收到

s.recv(1024) -> 'onetwothreefinish' 

或者,也許你收到

s.receive(1024) -> 'one' 
s.receive(1024) -> 'two' 
s.receive(1024) -> 'three' 
s.receive(1024) -> 'fin' 
s.receive(1024) -> 'ish' 
+0

如果這是問題,它應該是顯而易見的,因爲'print'會在每個塊之間放入一個換行符。儘管如此,請點擊這裏 –

+1

很難說如果不知道到底發送了什麼,如果在'完成'之前的最後一條消息只是空格或換行符,那麼很難注意到它們之間的區別 – Weeble

+0

避免這種情況的方法? –

0

比較區分大小寫。使用data.lower()if語句

1

你可以用data.lower比較,以確保所有大寫字母被改變爲小寫字母,也改變了while循環和刪除多餘的括號

while True: 
    data = s.recv(1024) 
    if not data: 
     break 
    print data 
print 'Finish 
+0

以及我不認爲這種情況,因爲在服務器端我使用c.send('完成'),所以數據將不會'完成' –

+0

我不認爲這是檢查數據是否正確的方式已經完成發送我總是用'if not'來檢查......我編輯了我的答案 – danidee