2016-03-01 3 views
1

Я только что начал с TCP-сервера и клиентского программирования на python. Однако один из из, если заявление не работает, и это не имеет никакого смысла:Если оператор пропущен, даже оператор верен

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

, а иногда и последняя полоса будет печатать «закончить» в вместо «Finish» и не могу выйти из цикла. Этого никогда не должно было быть, потому что оператор «print data» пропускается, если data = «finish». Может ли кто-нибудь сказать мне, почему это происходит?

+1

сохранить себя головную боль и просто сделать 'data.lower()', если вы получаете разные оболочки «финиша». – idjaw

+0

, так как я использую c.send ('finish') на стороне сервера, поэтому данные не будут «Готово». –

+1

Попробуйте 'print repr (data)' вместо этого, чтобы точно увидеть, что вы получаете. Может быть скрытый характер. –

ответ

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() в случае заявление

1

вы можете просто сравнить с data.lower, чтобы гарантировать, что все заглавные буквы заменяются на строчные буквы, а также изменить время цикла и удалить резервированные Брекеты

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

хорошо, я не думаю, что это так, поскольку на стороне сервера я использую c.send ('finish'), поэтому данные не будут «Готово» –

+0

Я не думаю, что это правильный способ проверить, являются ли данные Выполняется отправка. Я всегда проверял это с помощью 'if not' ... Я отредактировал свой ответ – danidee

Смежные вопросы