Python: закрыть сокет через определенное время, независимо от того, подключен ли клиент - PullRequest
0 голосов
/ 08 сентября 2018

Во-первых, я новичок в питоне, так что я не очень опытный. Вот код моего сервера - клиентской программы:

import getpass
from requests import get
import os
import thread
import socket
import sys

os.system('cls' if os.name == 'nt' else 'clear')
print '\033[91mMCP CONTROLLER\033[0m'
print ('--------------------------------------')
print ('Welcome back,' + getpass.getuser())
print ('--------------------------------------')
ip = get('https://api.ipify.org').text
print ('Your current external IP is: ' + ip) 
print ('--------------------------------------')

HOST = 'localhost'
PORT = 1979

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created!'

try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print 'lul'
    sys.exit()

print 'Socket bind complete'

s.listen(20)

print 'Listening...'


while 1:
    conn, addr = s.accept()
    print 'Client connected: ' + addr[0] + ':' + str(addr[1])

msg = conn.recv(1024)
print (msg) 


s.close()
print ('Please enter command')

Моя проблема в том, что я хочу, чтобы программа через 20 секунд остановила сокет и выполнила «печать (« Пожалуйста, введите команду »)», независимо от того, подключен кто-то к нему или нет. Если я запускаю программу сейчас, она просто говорит «Прослушивание ...» (если я не запускаю клиент) навсегда, и единственный вариант, который у меня есть, - это закрыть окно терминала. Но я хочу, чтобы программа продолжала работать через 20 секунд. И я также хочу, чтобы в нем было какое-то специальное сообщение, если через 20 секунд не было никакого соединения (например, печать «клиент недоступен»)

Прошу прощения за мой плохой английский.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Как уже упоминалось @abarnet, settimeout - это то, что вам нужно, вот пример:

import getpass
from requests import get
import os
import thread
import socket
import sys
import time

os.system('cls' if os.name == 'nt' else 'clear')
print('\033[91mMCP CONTROLLER\033[0m')
print ('--------------------------------------')
print ('Welcome back,' + getpass.getuser())
print ('--------------------------------------')
ip = get('https://api.ipify.org').text
print ('Your current external IP is: ' + ip) 
print ('--------------------------------------')

HOST = 'localhost'
PORT = 1979

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket created!')

try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print( 'lul')
    sys.exit()

print( 'Socket bind complete')

s.settimeout(5)
s.listen(20)

print ('Listening...')

while 1:
    try:
        conn, addr = s.accept()
        msg = conn.recv(1024)
        print (msg) 
    except socket.timeout as e:
        print(e,': no connections after 5 seconds...')
        s.close()
        break
    print( 'Client connected: ' + addr[0] + ':' + str(addr[1]))

print('please enter command:')
0 голосов
/ 08 сентября 2018

Используйте socket.settimeout ()

s.settimeout (20);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...