2015-06-18 2 views
0

Этот код может создавать сокет, подключаться к выбранному серверу и порту и печатать ответ. У меня вопрос, как я могу слушать порт дольше, чем один момент? Например. Я хочу прослушивать выбранный порт в течение 20 секунд и печатать все пакеты, которые появятся в это время. Возможно ли это с помощью этого кода?Python 3.4 прослушивание выбранного сервера и порта

import socket 
import sys 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

except socket.error as msg: 
    print("Failed to create socket. Error code: " + str(msg[0]) + ' , Error message : ' + msg[1]) 
    sys.exit(); 

print('Socket Created') 

host = #server 
port = #port 
try: 
    remote_ip = socket.gethostbyname(host) 

except socket.gaierror: 
    print('Hostname could not be resolved. Exiting') 
    sys.exit() 

print('Ip address of ' + host + ' is ' + remote_ip) 

s.connect((remote_ip , port)) 

print('Socket Connected to ' + host + ' on ip ' + remote_ip) 

reply = s.recv(4096) 

print(reply) 
+0

Вы знакомы с понятием цикла? –

+0

Петли не могут помочь в этом случае – Tkininter

ответ

0

Вы можете попытаться установить таймаут для сокета, чтобы соответствовать вашему требованию, если я правильно понял, что вам просто нужно подождать один раз в течение 20 секунд.

s.settimeout(20) 
reply = s.recv(4096) 

Python Socket settimeout()

Однако вы не гарантированно получить все пакеты данных доставляются сразу. Так, как упоминалось в комментарии, вы должны быть петлями. Способ сделать это - поместить сокет в неблокирующий режим.

Вне вашей петли вам нужен buffer_variable, который будет содержать итоговые результаты recv().

Перед тем, как ввести свой цикл, вы должны запустить таймер. После ввода цикла вы начнете называть recv() на сокете, сохраняя результат в local_variable. Каждый раз, когда вы получаете что-то новое в local_variable, вы добавляете его в buffer_variable.

Когда таймер истекает, вы должны затем break петли и обработать ваши данные с buffer_variable соответственно.

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